pg_dump: fix crash on error
If pg_dump fails to connect to Postgres, it attempts to print an error
message in ConnectDatabase():
/* check to see that the backend connection was successfully made */
if (PQstatus(AH->connection) == CONNECTION_BAD)
die_horribly(AH, modulename,
"connection to database \"%s\" failed: %s",
dbname, PQerrorMessage(AH->connection));
But if no database is explicitly specified, `dbname' is NULL, and libc
is entitled to crash if you pass a NULL pointer to it for a %s
formatting sequence (it actually does crash on Solaris, for example --
per report from Omar Kilani).
Attached is a patch that fixes this by just removing `dbname' from the
error message, as PQerrorMessage() should provide enough information.
Barring any objections, I'll apply this to HEAD and back branches within
24 hours.
-Neil
Attachments:
pg_dump_null_pointer_printf-1.patchtext/x-patch; name=pg_dump_null_pointer_printf-1.patchDownload+4-4
Neil Conway <neilc@samurai.com> writes:
If pg_dump fails to connect to Postgres, it attempts to print an error
message in ConnectDatabase():
...
But if no database is explicitly specified, `dbname' is NULL, and libc
is entitled to crash if you pass a NULL pointer to it for a %s
formatting sequence (it actually does crash on Solaris, for example --
per report from Omar Kilani).
[ scratches head... ] Did this code change recently? It's a tad hard
to believe that such a thing could have gone unnoticed for long.
regards, tom lane
Tom Lane wrote:
[ scratches head... ] Did this code change recently? It's a tad hard
to believe that such a thing could have gone unnoticed for long.
Seems the problem was introduced here:
http://developer.postgresql.org/cvsweb.cgi/pgsql/src/bin/pg_dump/pg_backup_db.c.diff?r1=1.58;r2=1.59
(I could just revert the code to using PQdb(), but I don't think there's
a need to mention the database in the error message ourselves --
PQerrorMessage() should include that information if appropriate.)
-Neil
Neil Conway <neilc@samurai.com> writes:
Tom Lane wrote:
[ scratches head... ] Did this code change recently? It's a tad hard
to believe that such a thing could have gone unnoticed for long.
Seems the problem was introduced here:
http://developer.postgresql.org/cvsweb.cgi/pgsql/src/bin/pg_dump/pg_backup_db.c.diff?r1=1.58;r2=1.59
Oh dear, that makes it my fault :-(
(I could just revert the code to using PQdb(), but I don't think there's
a need to mention the database in the error message ourselves --
PQerrorMessage() should include that information if appropriate.)
I'd go with reverting it to using PQdb, myself. Looks like I got bit by
the perennial mantra: premature optimization is the root of all evil.
regards, tom lane