aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2014-10-22 18:41:44 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2014-10-22 18:41:44 -0400
commit69fed5b26fa34fc825c7ed0a8d97221ff448e9c5 (patch)
treeec0363b4cd9beaebf3dee127a3c3ff76e67b3fcd /src
parent2ae7811db87bf54e8a70aae3cfd9f7cc7eff0bc4 (diff)
downloadpostgresql-69fed5b26fa34fc825c7ed0a8d97221ff448e9c5.tar.gz
postgresql-69fed5b26fa34fc825c7ed0a8d97221ff448e9c5.zip
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.
Diffstat (limited to 'src')
-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 44f7d039784..f58d7987423 100644
--- a/src/interfaces/libpq/fe-misc.c
+++ b/src/interfaces/libpq/fe-misc.c
@@ -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 */