postgres.git / summary / log / commit / refs

commit    ac6e8753707337d338e3a5fdb99d4f593ebc2df5
Author:   Tom Lane <tgl@sss.pgh.pa.us>
Date:     Wed Oct 22 22:42:01 2014 +0000
First released in: 9.5.0, 9.0.19, 9.1.15, 9.2.10, 9.3.6, 9.4.0

    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.


src/interfaces/libpq/fe-misc.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/interfaces/libpq/fe-misc.c b/src/interfaces/libpq/fe-misc.c index f4e636743f7..60c9345aef7 100644 --- a/src/interfaces/libpq/fe-misc.c +++ b/src/interfaces/libpq/fe-misc.c @@ -730,12 +730,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; } /* @@ -774,9 +770,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); [parent: 98170fa46507]