Re: pg_ctl -o option dumps core when processing postmaster arguments... - Mailing list pgsql-patches

From Bruce Momjian
Subject Re: pg_ctl -o option dumps core when processing postmaster arguments...
Date
Msg-id 200407291610.i6TGA9A29923@candle.pha.pa.us
Whole thread Raw
List pgsql-patches
[ CC to patches.]

Yep, that is a bug.  Patch attached and applied.

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

Sean Chittenden wrote:
> > Uh, this patch is strange:
> >
> > -#define WHITESPACE "\f\n\r\t\v"                /* as defined by
> > isspace() */
> > +#define WHITESPACE "\f\n\r\t\v\0"      /* as defined by isspace() */
> >
> > They are processed the same by the backend because every string has a
> > trailing null.  I think there must be some other bug that this covers
> > up.
>
> I was thinking that OS-X had its own implementation of isspace() that
> didn't check '\0', but I have no clue what exactly the problem is
> beyond that.  All I know is that on line 362 of
> src/bin/pg_ctl/pg_ctl.h, I'm going *way* past the end post_opts in
> test_postmaster_connection().  I stepped through things, and isspace()
> wasn't stopping on '\0' and kept processing some 2M worth of address
> space before it died in some other chunk of code.  Like I said, FYI.
>
>     361                  /* Advance to next whitespace */
>     362                  while (!isspace(*p))
>     363                          p++;
>
> I'd send this to -bugs, but I'm trying to figure out why my ISP is now
> in SpamHaus.  I'm pretty sure it's because they acquired another
> company a few months ago and ARIN just processed the change of
> ownership for the IP block.  RBLs are horrible.  -sc
>
> >> The attached space adds '\0' as a whitespace character and prevents
> >> pg_ctl from running out of bounds when processing arguments for -o.  I
> >> don't think this ever worked, at least on Mac, but I suspect every
> >> platform suffered from this bug.
> >>
> >> % gdb ./bin/pg_ctl
> >> GNU gdb 5.3-20030128 (Apple version gdb-309) (Thu Dec  4 15:41:30 GMT
> >> 2003)
> >> This GDB was configured as "powerpc-apple-darwin".
> >> Reading symbols for shared libraries ........ done
> >> (gdb) set arg -w -o -F start
> >> (gdb) run
> >> Starting program: /usr/local/pgsql/bin/pg_ctl -w -o -F start
> >> Reading symbols for shared libraries ++.. done
> >> waiting for postmaster to start...
> >> Program received signal EXC_BAD_ACCESS, Could not access memory.
> >> test_postmaster_connection () at pg_ctl.c:363
> >> 363                             p++;
> >> (gdb) bt
> >> #0  test_postmaster_connection () at pg_ctl.c:363
> >> #1  0x00003594 in do_start () at pg_ctl.c:539
> >> #2  0x00003594 in do_start () at pg_ctl.c:539
> >> #3  0x00004874 in main (argc=-1610604968, argv=0x0) at pg_ctl.c:1360
> >> (gdb) p *p
> >> $1 = 0 '\0'
> >>
> >> -sc
> >
> > [ Attachment, skipping... ]
> >
> >>
> >> --
> >> Sean Chittenden
> >
> > --
> >   Bruce Momjian                        |  http://candle.pha.pa.us
> >   pgman@candle.pha.pa.us               |  (610) 359-1001
> >   +  If your life is a hard drive,     |  13 Roberts Road
> >   +  Christ can be your backup.        |  Newtown Square, Pennsylvania
> > 19073
> >
> --
> Sean Chittenden
>

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.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/bin/pg_ctl/pg_ctl.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/bin/pg_ctl/pg_ctl.c,v
retrieving revision 1.23
diff -c -c -r1.23 pg_ctl.c
*** src/bin/pg_ctl/pg_ctl.c    22 Jul 2004 01:44:36 -0000    1.23
--- src/bin/pg_ctl/pg_ctl.c    29 Jul 2004 15:36:15 -0000
***************
*** 359,365 ****
              /* keep looking, maybe there is another -p */
          }
          /* Advance to next whitespace */
!         while (!isspace(*p))
              p++;
      }

--- 359,365 ----
              /* keep looking, maybe there is another -p */
          }
          /* Advance to next whitespace */
!         while (*p && !isspace(*p))
              p++;
      }


pgsql-patches by date:

Previous
From: "Magnus Hagander"
Date:
Subject: Re: win32 version info
Next
From: Bruce Momjian
Date:
Subject: Re: Updated Turkish FAQ