From: Tom Lane Date: Wed, 22 Oct 2014 22:41:47 +0000 (-0400) Subject: Ensure libpq reports a suitable error message on unexpected socket EOF. X-Git-Tag: REL9_4_RC1~65 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b53942e59644d79c2df7951523a50dc4d2d97668;p=postgresql 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. --- diff --git a/src/interfaces/libpq/fe-misc.c b/src/interfaces/libpq/fe-misc.c index 7a213bf839..1d5959b9ed 100644 --- a/src/interfaces/libpq/fe-misc.c +++ b/src/interfaces/libpq/fe-misc.c @@ -763,12 +763,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; } /* @@ -807,9 +803,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 */