Обсуждение: pg_dumpall segfault

Поиск
Список
Период
Сортировка

pg_dumpall segfault

От
Nick Eskelinen
Дата:
============================================================================
                        POSTGRESQL BUG REPORT TEMPLATE
============================================================================


Your name               :       Nick Eskelinen
Your email address      :    nickesk@cs.bu.edu


System Configuration
---------------------
  Architecture (example: Intel Pentium)         :   UltraSparc

  Operating System (example: Linux 2.0.26 ELF)  :   Solaris 8

  PostgreSQL version (example: PostgreSQL-7.3.2):   PostgreSQL-7.3.2

  Compiler used (example:  gcc 2.95.2)          :   gcc 3.2.2


Please enter a FULL description of your problem:
------------------------------------------------
pg_dumpall segfaults when trying to dump group information.
Postmaster and pg_dump run fine in this installation.

Output from gdb
---------------

(gdb) r -U postgres
Starting program: /fs/cs-db/local/postgresql-7.3.2/bin/pg_dumpall -U postgres
Password:

--
-- PostgreSQL database cluster dump
--

\connect "template1"

--
-- Users
--

 [user information]

--
-- Groups
--

DELETE FROM pg_group;

Program received signal SIGSEGV, Segmentation fault.
0xfef331bc in strlen () from /usr/lib/libc.so.1

(gdb) bt
#0  0xfef331bc in strlen () from /usr/lib/libc.so.1
#1  0xfef861c8 in _doprnt () from /usr/lib/libc.so.1
#2  0xfef8833c in vsnprintf () from /usr/lib/libc.so.1
#3  0xff2386d0 in appendPQExpBuffer (str=0x273a8,
    fmt=0x14c00 "SELECT usename FROM pg_shadow WHERE usesysid = %s;")
    at pqexpbuffer.c:234
#4  0x00011c40 in dumpGroups (conn=0x27b00) at pg_dumpall.c:353
#5  0x000115b8 in main (argc=3, argv=0xffbef9e4) at pg_dumpall.c:196

(gdb) up 3
#3  0xff2386d0 in appendPQExpBuffer (str=0x273a8,
    fmt=0x14c00 "SELECT usename FROM pg_shadow WHERE usesysid = %s;")
    at pqexpbuffer.c:234
234                             nprinted = vsnprintf(str->data + str->len, avail,

(gdb) i lo
args = 0xffbef8ac
avail = 255
nprinted = 30

(gdb) p *str
$1 = {data = 0x300b8 "SELECT usename FROM pg_shadow WHERE usesysid = ",
  len = 0, maxlen = 256}


Please describe a way to repeat the problem.   Please try to provide a
concise reproducible example, if at all possible:
----------------------------------------------------------------------
All invocations of pg_dumpall result in a segmentation fault.


If you know how this problem might be fixed, list the solution below:
---------------------------------------------------------------------

Re: pg_dumpall segfault

От
Tom Lane
Дата:
Nick Eskelinen <nickesk@cs.bu.edu> writes:
> pg_dumpall segfaults when trying to dump group information.

Hmm, you have any empty (member-less) groups?  Looks like this loop
needs a test at the top not the bottom ...

            regards, tom lane

Re: pg_dumpall segfault

От
Tom Lane
Дата:
Nick Eskelinen <nickesk@bu.edu> writes:
> Ahh... as a matter of fact I do. Adding someone to this empty group
> corrects the problem.

Thought so.  I've committed a fix if you need it:

*** src/bin/pg_dump/pg_dumpall.c.orig    Thu Mar  6 16:45:52 2003
--- src/bin/pg_dump/pg_dumpall.c    Fri Mar 14 17:41:56 2003
***************
*** 327,333 ****

          val = strdup(PQgetvalue(res, i, 2));
          tok = strtok(val, ",{}");
!         do
          {
              PGresult   *res2;
              PQExpBuffer buf2 = createPQExpBuffer();
--- 327,333 ----

          val = strdup(PQgetvalue(res, i, 2));
          tok = strtok(val, ",{}");
!         while (tok)
          {
              PGresult   *res2;
              PQExpBuffer buf2 = createPQExpBuffer();
***************
*** 347,353 ****

              tok = strtok(NULL, "{},");
          }
!         while (tok);

          printf("%s", buf->data);
          destroyPQExpBuffer(buf);
--- 347,353 ----

              tok = strtok(NULL, "{},");
          }
!         free(val);

          printf("%s", buf->data);
          destroyPQExpBuffer(buf);

            regards, tom lane

Re: pg_dumpall segfault

От
Nick Eskelinen
Дата:
Ahh... as a matter of fact I do. Adding someone to this empty group
corrects the problem.

Thanks!
Nick

On Fri, Mar 14, 2003 at 05:32:42PM -0500, Tom Lane wrote:
> Nick Eskelinen <nickesk@cs.bu.edu> writes:
> > pg_dumpall segfaults when trying to dump group information.
>
> Hmm, you have any empty (member-less) groups?  Looks like this loop
> needs a test at the top not the bottom ...
>
>             regards, tom lane