summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2014-10-22 18:41:57 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2014-10-22 18:41:57 -0400
commit98144378c4811b71728e5d78c043d6a147e5e0bc (patch)
treed914042f64ca3bc76ca1912d6e4ae27211a51fba
parentd5fef87e9672c3099015b4aa0833a8336ac8ad94 (diff)
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.
-rw-r--r--src/interfaces/libpq/fe-misc.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/src/interfaces/libpq/fe-misc.c b/src/interfaces/libpq/fe-misc.c
index f10583d86ff..5d61a3cbb5f 100644
--- a/src/interfaces/libpq/fe-misc.c
+++ b/src/interfaces/libpq/fe-misc.c
@@ -738,12 +738,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;
}
/*
@@ -782,9 +778,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:
conn->status = CONNECTION_BAD; /* No more connection to backend */
pqsecure_close(conn);