Thanks. Applied.
>
> > We already use strdup a lot. Want to send a new patch?
>
>
>
> attached is take-2 of a patch which fixes a bug related
> to the use of getpwuid when running in standalone mode.
> this patch allocates some persistent storage (using
> strdup) to store the username obtained with getpwuid
> in src/backend/main/main.c. this is necessary because
> later on, getpwuid is called again (in ValidateBinary).
>
> the man pages for getpwuid on SCO OpenServer, FreeBSD,
> and Darwin all have words to this effect (this is from
> the SCO OpenServer man page):
>
> Note
> ====
> All information is contained in a static area, so it must
> be copied if it is to be saved. Otherwise, it may be
> overwritten on subsequent calls to these routines.
>
> in particular, on my platform, the storage used to hold
> the pw_name from the first call is overwritten such that
> it looks like an empty username. this causes a problem
> later on in SetSessionUserIdFromUserName.
>
> i'd assume this isn't a problem on most platforms because
> getpwuid is called with the same UID both times, and the
> same thing ends up happening to that static storage each
> time. however, that's not guaranteed, and is _not_ what
> happens on my platform (at least :).
>
> this is for the version of 7.1 available via anon cvs as
> of Tue Jan 23 15:14:00 2001 PST:
> .../src/backend/main/main.c,v 1.37 2000/12/31 18:04:35 tgl Exp
>
> -michael thornburgh, zenomt@armory.com
>
>
>
> *** src/backend/main/main.c.orig Mon Jan 22 17:09:50 2001
> --- src/backend/main/main.c Tue Jan 23 17:00:07 2001
> ***************
> *** 53,58 ****
> --- 53,59 ----
> {
> int len;
> struct passwd *pw;
> + char * pw_name_persist;
>
> /*
> * Place platform-specific startup hacks here. This is the right
> ***************
> *** 158,163 ****
> fprintf(stderr, "%s: invalid current euid", argv[0]);
> exit(1);
> }
>
> ! exit(PostgresMain(argc, argv, argc, argv, pw->pw_name));
> }
> --- 159,165 ----
> fprintf(stderr, "%s: invalid current euid", argv[0]);
> exit(1);
> }
> + pw_name_persist = strdup(pw->pw_name);
>
> ! exit(PostgresMain(argc, argv, argc, argv, pw_name_persist));
> }
>
--
Bruce Momjian | http://candle.pha.pa.us
pgman@candle.pha.pa.us | (610) 853-3000
+ If your life is a hard drive, | 830 Blythe Avenue
+ Christ can be your backup. | Drexel Hill, Pennsylvania 19026