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