mirror of
https://github.com/postgres/postgres.git
synced 2026-07-09 17:51:00 -04:00
libpq: Make error checks in the new buffer draining code more robust
Check explicitly for pqsecure_read() returning an error. It shouldn't fail, and we would've caught it in the check for a short read, but better to be explicit so that the error message is more informative. We also shouldn't update 'inEnd' when the read fails, although that too is just pro forma as we will bail out and close the connection on error. Reported-by: Peter Eisentraut <peter@eisentraut.org> Discussion: https://www.postgresql.org/message-id/34844e8c-267c-4daf-b1e0-f26059a4a7d3@eisentraut.org Backpatch-through: 14
This commit is contained in:
parent
6243ea6c34
commit
56988064bc
2 changed files with 11 additions and 5 deletions
|
|
@ -914,13 +914,18 @@ pqDrainPending(PGconn *conn)
|
|||
|
||||
nread = pqsecure_read(conn, conn->inBuffer + conn->inEnd,
|
||||
bytes_pending);
|
||||
conn->inEnd += nread;
|
||||
|
||||
/* When there are bytes pending, the read function is not supposed to fail */
|
||||
/*
|
||||
* When there are bytes pending, pqsecure_read() is not supposed to fail
|
||||
* or do a short read, but let's check anyway to be safe.
|
||||
*/
|
||||
if (nread < 0)
|
||||
return -1;
|
||||
conn->inEnd += nread;
|
||||
if (nread != bytes_pending)
|
||||
{
|
||||
libpq_append_conn_error(conn,
|
||||
"drained only %zu of %zd pending bytes in transport buffer",
|
||||
"drained only %zd of %zd pending bytes in transport buffer",
|
||||
nread, bytes_pending);
|
||||
return -1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -284,8 +284,9 @@ pqsecure_raw_read(PGconn *conn, void *ptr, size_t len)
|
|||
* Return the number of bytes available in the transport buffer.
|
||||
*
|
||||
* If pqsecure_read() is called for this number of bytes, it's guaranteed to
|
||||
* return successfully without reading from the underlying socket. See
|
||||
* pqDrainPending() for a more complete discussion of the concepts involved.
|
||||
* return successfully with the same number of bytes, without reading from the
|
||||
* underlying socket. See pqDrainPending() for a more complete discussion of
|
||||
* the concepts involved.
|
||||
*/
|
||||
ssize_t
|
||||
pqsecure_bytes_pending(PGconn *conn)
|
||||
|
|
|
|||
Loading…
Reference in a new issue