Ensure libpq reports a suitable error message on unexpected socket EOF.

The EOF-detection logic in pqReadData was a bit confused about who should
set up the error message in case the kernel gives us read-ready-but-no-data
rather than ECONNRESET or some other explicit error condition.  Since the
whole point of this situation is that the lower-level functions don't know
there's anything wrong, pqReadData itself must set up the message.  But
keep the assumption that if an errno was reported, a message was set up at
lower levels.

Per bug #11712 from Marko Tiikkaja.  It's been like this for a very long
time, so back-patch to all supported branches.
This commit is contained in:
Tom Lane 2014-10-22 18:41:44 -04:00
parent 2ae7811db8
commit 69fed5b26f

View File

@ -764,12 +764,8 @@ retry3:
/* ready for read */
break;
default:
printfPQExpBuffer(&conn->errorMessage,
libpq_gettext(
"server closed the connection unexpectedly\n"
"\tThis probably means the server terminated abnormally\n"
"\tbefore or while processing the request.\n"));
goto definitelyFailed;
/* we override pqReadReady's message with something more useful */
goto definitelyEOF;
}
/*
@ -808,9 +804,16 @@ retry4:
/*
* OK, we are getting a zero read even though select() says ready. This
* means the connection has been closed. Cope. Note that errorMessage
* has been set already.
* means the connection has been closed. Cope.
*/
definitelyEOF:
printfPQExpBuffer(&conn->errorMessage,
libpq_gettext(
"server closed the connection unexpectedly\n"
"\tThis probably means the server terminated abnormally\n"
"\tbefore or while processing the request.\n"));
/* Come here if lower-level code already set a suitable errorMessage */
definitelyFailed:
pqDropConnection(conn);
conn->status = CONNECTION_BAD; /* No more connection to backend */