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



---------------------------(end of broadcast)---------------------------
TIP 6: Have you searched our list archives?

http://www.postgresql.org/search.mpl

Reply via email to