PQsetdbLogin bug?
| От | Tatsuo Ishii |
|---|---|
| Тема | PQsetdbLogin bug? |
| Дата | |
| Msg-id | 20010525221239F.t-ishii@sra.co.jp обсуждение исходный текст |
| Ответы |
Re: PQsetdbLogin bug?
|
| Список | pgsql-hackers |
Sometimes PQfinish() does not return forever in the following program.
conn = PQsetdbLogin();
if(PQstatus(conn) == CONNECTION_BAD)
{ PQfinish(conn); /* blocks here */
}
PQfinish calls closePGconn that call pqPuts. pqPuts calls select(2)
and it never returns if a connection associated with the socket is not
established.
This could happend if the connection is not established, but the
socket is still opened by PQsetdbLogin. Possible fixes are:
1) close the socket in PQsetdbLogin if it is in a situation being returns CONNECTION_BAD
case PGRES_POLLING_WRITING: if (pqWait(0, 1, conn)) { conn->status = CONNECTION_BAD;
close(conn->sock); <-- add this conn->sock == -1; <-- add this return 0; }
break;
2) check if the status of handle returned PQsetdbLogin is CONNECTION_BAD closePGconn. if so, do not call pqPuts (and
pqFlush)
change this:if (conn->sock >= 0)
to:if (conn->status != CONNECTION_BAD && conn->sock >= 0)
any thoughts?
--
Tatsuo Ishii
В списке pgsql-hackers по дате отправления: