Re: [BUGS] BUG #2195: log_min_messages crash server when in

From: Bruce Momjian <pgman(at)candle(dot)pha(dot)pa(dot)us>
To: Bruce Momjian <pgman(at)candle(dot)pha(dot)pa(dot)us>
Cc: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>, "Milen A(dot) Radev" <milen(at)radev(dot)net>, PostgreSQL-patches <pgsql-patches(at)postgresql(dot)org>
Subject: Re: [BUGS] BUG #2195: log_min_messages crash server when in
Date: 2006-02-01 00:50:17
Message-ID: 200602010050.k110oHw16746@candle.pha.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs pgsql-patches


Applied to HEAD, 8.1.X and 8.0.X.

---------------------------------------------------------------------------

Bruce Momjian wrote:
> Tom Lane wrote:
> > Bruce Momjian <pgman(at)candle(dot)pha(dot)pa(dot)us> writes:
> > > The problem is that for EXEC_BACKEND, which is the default for WIN32 and
> > > what I used for testing, progname is NULL because we do not set it after
> > > the fork/exec. Most versions of printf report "(null)" for a null
> > > argument to printf("%s"), but our port/snprintf.c version aborts, which
> > > is probably better in terms of finding bugs.
> >
> > Good catch.
> >
> > > The attached patch fixes the problem by setting progname early in
> > > main(), like we do for all other applications.
> >
> > It'd probably be best to strdup() argv[0], because of the likelihood
> > that the argv area will get clobbered at some point by ps_status.c.
> > It was OK to have a private static in postmaster.c, because the
> > postmaster doesn't ever call ps_status.c, but if we are going to expose
> > the variable in child processes it needs to be more globally valid.
> >
> > I see that get_progname strdup's its argument in some cases but not
> > all --- so simplest fix is to make it always do so.
>
> OK, new version that updates get_progname to always strdup().
>
> --
> Bruce Momjian | http://candle.pha.pa.us
> pgman(at)candle(dot)pha(dot)pa(dot)us | (610) 359-1001
> + If your life is a hard drive, | 13 Roberts Road
> + Christ can be your backup. | Newtown Square, Pennsylvania 19073

> Index: src/backend/main/main.c
> ===================================================================
> RCS file: /cvsroot/pgsql/src/backend/main/main.c,v
> retrieving revision 1.99
> diff -c -c -r1.99 main.c
> *** src/backend/main/main.c 5 Jan 2006 03:01:34 -0000 1.99
> --- src/backend/main/main.c 31 Jan 2006 21:03:01 -0000
> ***************
> *** 45,51 ****
> #include "libpq/pqsignal.h"
> #endif
>
> !
>
> int
> main(int argc, char *argv[])
> --- 45,51 ----
> #include "libpq/pqsignal.h"
> #endif
>
> ! const char *progname;
>
> int
> main(int argc, char *argv[])
> ***************
> *** 77,82 ****
> --- 77,84 ----
> char *env_locale;
> #endif
>
> + progname = get_progname(argv[0]);
> +
> /*
> * On some platforms, unaligned memory accesses result in a kernel trap;
> * the default kernel behavior is to emulate the memory access, but this
> ***************
> *** 246,252 ****
> * possibly first argument) we were called with. The lack of consistency
> * here is historical.
> */
> ! if (strcmp(get_progname(argv[0]), "postmaster") == 0)
> {
> /* Called as "postmaster" */
> exit(PostmasterMain(argc, argv));
> --- 248,254 ----
> * possibly first argument) we were called with. The lack of consistency
> * here is historical.
> */
> ! if (strcmp(progname, "postmaster") == 0)
> {
> /* Called as "postmaster" */
> exit(PostmasterMain(argc, argv));
> Index: src/backend/postmaster/postmaster.c
> ===================================================================
> RCS file: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v
> retrieving revision 1.479
> diff -c -c -r1.479 postmaster.c
> *** src/backend/postmaster/postmaster.c 6 Jan 2006 02:58:25 -0000 1.479
> --- src/backend/postmaster/postmaster.c 31 Jan 2006 21:03:04 -0000
> ***************
> *** 171,179 ****
> */
> int ReservedBackends;
>
> -
> - static const char *progname = NULL;
> -
> /* The socket(s) we're listening to. */
> #define MAXLISTEN 64
> static int ListenSocket[MAXLISTEN];
> --- 171,176 ----
> ***************
> *** 383,391 ****
> char *userDoption = NULL;
> int i;
>
> - /* This will call exit() if strdup() fails. */
> - progname = get_progname(argv[0]);
> -
> MyProcPid = PostmasterPid = getpid();
>
> IsPostmasterEnvironment = true;
> --- 380,385 ----
> Index: src/include/postmaster/postmaster.h
> ===================================================================
> RCS file: /cvsroot/pgsql/src/include/postmaster/postmaster.h,v
> retrieving revision 1.11
> diff -c -c -r1.11 postmaster.h
> *** src/include/postmaster/postmaster.h 20 Aug 2005 23:26:33 -0000 1.11
> --- src/include/postmaster/postmaster.h 31 Jan 2006 21:03:06 -0000
> ***************
> *** 34,39 ****
> --- 34,40 ----
> extern HANDLE PostmasterHandle;
> #endif
>
> + extern const char *progname;
>
> extern int PostmasterMain(int argc, char *argv[]);
> extern void ClosePostmasterPorts(bool am_syslogger);
> Index: src/port/path.c
> ===================================================================
> RCS file: /cvsroot/pgsql/src/port/path.c,v
> retrieving revision 1.63
> diff -c -c -r1.63 path.c
> *** src/port/path.c 23 Dec 2005 22:34:22 -0000 1.63
> --- src/port/path.c 31 Jan 2006 21:03:06 -0000
> ***************
> *** 388,394 ****
> const char *
> get_progname(const char *argv0)
> {
> ! const char *nodir_name;
>
> nodir_name = last_dir_separator(argv0);
> if (nodir_name)
> --- 388,395 ----
> const char *
> get_progname(const char *argv0)
> {
> ! const char *nodir_name;
> ! const char *progname;
>
> nodir_name = last_dir_separator(argv0);
> if (nodir_name)
> ***************
> *** 396,420 ****
> else
> nodir_name = skip_drive(argv0);
>
> ! #if defined(__CYGWIN__) || defined(WIN32)
> ! /* strip .exe suffix, regardless of case */
> ! if (strlen(nodir_name) > sizeof(EXE) - 1 &&
> ! pg_strcasecmp(nodir_name + strlen(nodir_name) - (sizeof(EXE) - 1), EXE) == 0)
> {
> ! char *progname;
>
> ! progname = strdup(nodir_name); /* leaks memory, but called only once */
> ! if (progname == NULL)
> ! {
> ! fprintf(stderr, "%s: out of memory\n", nodir_name);
> ! exit(1); /* This could exit the postmaster */
> ! }
> progname[strlen(progname) - (sizeof(EXE) - 1)] = '\0';
> - nodir_name = progname;
> - }
> #endif
>
> ! return nodir_name;
> }
>
>
> --- 397,421 ----
> else
> nodir_name = skip_drive(argv0);
>
> ! /*
> ! * Make a copy in case argv[0] is modified by ps_status.
> ! * Leaks memory, but called only once.
> ! */
> ! progname = strdup(nodir_name);
> ! if (progname == NULL)
> {
> ! fprintf(stderr, "%s: out of memory\n", nodir_name);
> ! exit(1); /* This could exit the postmaster */
> ! }
>
> ! #if defined(__CYGWIN__) || defined(WIN32)
> ! /* strip ".exe" suffix, regardless of case */
> ! if (strlen(progname) > sizeof(EXE) - 1 &&
> ! pg_strcasecmp(progname + strlen(progname) - (sizeof(EXE) - 1), EXE) == 0)
> progname[strlen(progname) - (sizeof(EXE) - 1)] = '\0';
> #endif
>
> ! return progname;
> }
>
>

>
> ---------------------------(end of broadcast)---------------------------
> TIP 3: Have you checked our extensive FAQ?
>
> http://www.postgresql.org/docs/faq

--
Bruce Momjian | http://candle.pha.pa.us
pgman(at)candle(dot)pha(dot)pa(dot)us | (610) 359-1001
+ If your life is a hard drive, | 13 Roberts Road
+ Christ can be your backup. | Newtown Square, Pennsylvania 19073

In response to

Browse pgsql-bugs by date

  From Date Subject
Next Message Bruce Momjian 2006-02-01 01:03:41 Re: [PATCHES] BUG #2221: Bad delimiters allowed in COPY ...
Previous Message Bruce Momjian 2006-01-31 22:59:18 Re: BUG #2226: Can't delete elements from Enterprise Architect

Browse pgsql-patches by date

  From Date Subject
Next Message Bruce Momjian 2006-02-01 01:03:41 Re: [PATCHES] BUG #2221: Bad delimiters allowed in COPY ...
Previous Message Bruce Momjian 2006-01-31 22:40:15 Re: [BUGS] BUG #2223: Misleading info in docs on volatility level of