]> granicus.if.org Git - postgresql/commitdiff
Ensure libpq reports a suitable error message on unexpected socket EOF.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 22 Oct 2014 22:41:57 +0000 (18:41 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 22 Oct 2014 22:41:57 +0000 (18:41 -0400)
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.

src/interfaces/libpq/fe-misc.c

index f10583d86ff0134a95097ddc2bb5722123916534..5d61a3cbb5f477ce875e7b5faa33147e372ebfec 100644 (file)
@@ -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);