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:
parent
2ae7811db8
commit
69fed5b26f
@ -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 */
|
||||
|
Loading…
x
Reference in New Issue
Block a user