pg_dumpall segfault

Started by Nick Eskelinenabout 23 years ago4 messagesbugs
Jump to latest
#1Nick Eskelinen
nickesk@cs.bu.edu

============================================================================
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:
---------------------------------------------------------------------

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Nick Eskelinen (#1)
Re: pg_dumpall segfault

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

#3Nick Eskelinen
nickesk@bu.edu
In reply to: Tom Lane (#2)
Re: pg_dumpall segfault

Ahh... as a matter of fact I do. Adding someone to this empty group
corrects the problem.

Thanks!
Nick

Show quoted text

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

#4Tom Lane
tgl@sss.pgh.pa.us
In reply to: Nick Eskelinen (#3)
Re: pg_dumpall segfault

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