mirror of
https://github.com/postgres/postgres.git
synced 2025-07-20 05:03:10 +03:00
Ensure we discard unread/unsent data when abandoning a connection attempt.
There are assorted situations wherein PQconnectPoll() will abandon a connection attempt and try again with different parameters (eg, SSL versus not SSL). However, the code forgot to discard any pending data in libpq's I/O buffers when doing this. In at least one case (server returns E message during SSL negotiation), there is unread input data which bollixes the next connection attempt. I have not checked to see whether this is possible in the other cases where we close the socket and retry, but it seems like a matter of good defensive programming to add explicit buffer-flushing code to all of them. This is one of several issues exposed by Daniel Farina's report of misbehavior after a server-side fork failure. This has been wrong since forever, so back-patch to all supported branches.
This commit is contained in:
@ -1911,6 +1911,9 @@ keep_going: /* We will come back to here until there is
|
|||||||
closesocket(conn->sock);
|
closesocket(conn->sock);
|
||||||
conn->sock = -1;
|
conn->sock = -1;
|
||||||
conn->status = CONNECTION_NEEDED;
|
conn->status = CONNECTION_NEEDED;
|
||||||
|
/* Discard any unread/unsent data */
|
||||||
|
conn->inStart = conn->inCursor = conn->inEnd = 0;
|
||||||
|
conn->outCount = 0;
|
||||||
goto keep_going;
|
goto keep_going;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -1948,6 +1951,9 @@ keep_going: /* We will come back to here until there is
|
|||||||
closesocket(conn->sock);
|
closesocket(conn->sock);
|
||||||
conn->sock = -1;
|
conn->sock = -1;
|
||||||
conn->status = CONNECTION_NEEDED;
|
conn->status = CONNECTION_NEEDED;
|
||||||
|
/* Discard any unread/unsent data */
|
||||||
|
conn->inStart = conn->inCursor = conn->inEnd = 0;
|
||||||
|
conn->outCount = 0;
|
||||||
goto keep_going;
|
goto keep_going;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2061,6 +2067,9 @@ keep_going: /* We will come back to here until there is
|
|||||||
closesocket(conn->sock);
|
closesocket(conn->sock);
|
||||||
conn->sock = -1;
|
conn->sock = -1;
|
||||||
conn->status = CONNECTION_NEEDED;
|
conn->status = CONNECTION_NEEDED;
|
||||||
|
/* Discard any unread/unsent data */
|
||||||
|
conn->inStart = conn->inCursor = conn->inEnd = 0;
|
||||||
|
conn->outCount = 0;
|
||||||
goto keep_going;
|
goto keep_going;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2128,6 +2137,9 @@ keep_going: /* We will come back to here until there is
|
|||||||
closesocket(conn->sock);
|
closesocket(conn->sock);
|
||||||
conn->sock = -1;
|
conn->sock = -1;
|
||||||
conn->status = CONNECTION_NEEDED;
|
conn->status = CONNECTION_NEEDED;
|
||||||
|
/* Discard any unread/unsent data */
|
||||||
|
conn->inStart = conn->inCursor = conn->inEnd = 0;
|
||||||
|
conn->outCount = 0;
|
||||||
goto keep_going;
|
goto keep_going;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2147,6 +2159,9 @@ keep_going: /* We will come back to here until there is
|
|||||||
closesocket(conn->sock);
|
closesocket(conn->sock);
|
||||||
conn->sock = -1;
|
conn->sock = -1;
|
||||||
conn->status = CONNECTION_NEEDED;
|
conn->status = CONNECTION_NEEDED;
|
||||||
|
/* Discard any unread/unsent data */
|
||||||
|
conn->inStart = conn->inCursor = conn->inEnd = 0;
|
||||||
|
conn->outCount = 0;
|
||||||
goto keep_going;
|
goto keep_going;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -2308,6 +2323,9 @@ keep_going: /* We will come back to here until there is
|
|||||||
closesocket(conn->sock);
|
closesocket(conn->sock);
|
||||||
conn->sock = -1;
|
conn->sock = -1;
|
||||||
conn->status = CONNECTION_NEEDED;
|
conn->status = CONNECTION_NEEDED;
|
||||||
|
/* Discard any unread/unsent data */
|
||||||
|
conn->inStart = conn->inCursor = conn->inEnd = 0;
|
||||||
|
conn->outCount = 0;
|
||||||
goto keep_going;
|
goto keep_going;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user