patch for src/backend/main/main.c

From: "Michael C(dot) Thornburgh" <zenomt(at)armory(dot)com>
To: pgsql-patches(at)postgresql(dot)org
Subject: patch for src/backend/main/main.c
Date: 2001-01-23 16:41:26
Message-ID: 10101231641.aa10314@aldebaran.armory.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-patches

attached is a patch which fixes a bug related to
the use of getpwuid when running in standalone mode.
this patch allocates some persistent storage (using
malloc) 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(at)armory(dot)com

*** src/backend/main/main.c.orig Mon Jan 22 17:09:50 2001
--- src/backend/main/main.c Tue Jan 23 15:39:42 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,172 ----
fprintf(stderr, "%s: invalid current euid", argv[0]);
exit(1);
}
+ len = strlen(pw->pw_name);
+ pw_name_persist = (char *) malloc(len+1);
+ if (pw_name_persist == (char *)NULL)
+ {
+ fprintf(stderr, "%s: can't malloc for username\n", argv[0]);
+ exit(1);
+ }
+ strncpy(pw_name_persist, pw->pw_name, len+1);

! exit(PostgresMain(argc, argv, argc, argv, pw_name_persist));
}

Responses

Browse pgsql-patches by date

  From Date Subject
Next Message Michael C. Thornburgh 2001-01-23 17:31:18 Re: patch for src/backend/main/main.c
Previous Message Thomas Lockhart 2001-01-23 16:32:23 Re: [PATCHES] Re: [HACKERS] ODBC Driver int8 Patch