Re: BUG #7811: strlen(NULL) cause psql crash

From: Heikki Linnakangas <hlinnakangas(at)vmware(dot)com>
To: 1584171677(at)qq(dot)com
Cc: pgsql-bugs(at)postgresql(dot)org
Subject: Re: BUG #7811: strlen(NULL) cause psql crash
Date: 2013-01-15 17:29:08
Message-ID: 50F591E4.2080508@vmware.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

On 15.01.2013 16:18, 1584171677(at)qq(dot)com wrote:
> I give you a description about how to trigger this bug first:
> (1) start the server with the command "postgres -D pgdata"
> (2) start the client with the command "psql"
> (3) close the server
> (4) execute a query from the client "slect *from t; ". At this
> time, the client detected that it lost the connection with the server.
> (5) execute the following command from the client "\?", then the
> client will crash.
>
> I have found the reason which caused that.
>
> (1) When the client execute "slect *from t; ", it execute the
> function "ResetCancelConn()" at line 364 in src\bin\psql\common.c ,and the
> function set pset.db to NULL.
> (2) When the client execute "\?", it execute the function fprintf
> at line 254 in help.c. The value returned by PQdb(pset.db) is an argument of
> fprintf, and at this time PQdb returned NULL.
> (3) This NULL was finally passed to strlen at line 779 in
> snprintf.c through several simple fuction calls, so psql crashed.

Thanks for the report and debugging!

> I hava fixed the bug in the following way which may be not the best:
>
> (1) add a string named strofnull, and in the function "dopr" in
> file src\port\snprintf.c
> char *strofnull="(null)";
>
> (2) add an if statment before calling fmtstr at about line 720 in
> file src\port\snprintf.c
>
> if (strvalue==NULL)
> {
> strvalue=strofnull;
> }

That'd change the behavior of all sprintf calls, not sure we want to go
there. Might not be a bad idea to avoid crashes if there are more bugs
like this, but one really should not pass NULL to sprintf to begin with.
I committed a local fix to help.c to print "none" as the database name
when not connected.

- Heikki

In response to

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message Tom Lane 2013-01-15 18:10:56 Re: BUG #7811: strlen(NULL) cause psql crash
Previous Message chip 2013-01-15 16:06:05 BUG #7812: pgadmin3_92 will not uninstall