From: Tom Lane Date: Mon, 4 Aug 2003 17:25:29 +0000 (+0000) Subject: Fix some more problems with testing error returns from SSL. X-Git-Url: http://git.postgresql.org/gitweb/static/gitweb.js?a=commitdiff_plain;h=486d73fddc3ff55a69d7970f704adf65c66bb7d7;p=users%2Fbernd%2Fpostgres.git Fix some more problems with testing error returns from SSL. --- diff --git a/src/interfaces/libpq/fe-misc.c b/src/interfaces/libpq/fe-misc.c index 34d36cbf6a..656c34e8d1 100644 --- a/src/interfaces/libpq/fe-misc.c +++ b/src/interfaces/libpq/fe-misc.c @@ -553,7 +553,18 @@ retry3: * file is ready. Grumble. Fortunately, we don't expect this path to * be taken much, since in normal practice we should not be trying to * read data unless the file selected for reading already. + * + * In SSL mode it's even worse: SSL_read() could say WANT_READ and then + * data could arrive before we make the pqReadReady() test. So we must + * play dumb and assume there is more data, relying on the SSL layer to + * detect true EOF. */ + +#ifdef USE_SSL + if (conn->ssl) + return 0; +#endif + switch (pqReadReady(conn)) { case 0: diff --git a/src/interfaces/libpq/fe-secure.c b/src/interfaces/libpq/fe-secure.c index 0ef00d987a..573c86c7c6 100644 --- a/src/interfaces/libpq/fe-secure.c +++ b/src/interfaces/libpq/fe-secure.c @@ -278,21 +278,25 @@ pqsecure_read(PGconn *conn, void *ptr, size_t len) libpq_gettext("SSL SYSCALL error: %s\n"), SOCK_STRERROR(SOCK_ERRNO)); else + { printfPQExpBuffer(&conn->errorMessage, libpq_gettext("SSL SYSCALL error: EOF detected\n")); + SOCK_ERRNO = ECONNRESET; + n = -1; + } break; case SSL_ERROR_SSL: printfPQExpBuffer(&conn->errorMessage, libpq_gettext("SSL error: %s\n"), SSLerrmessage()); /* fall through */ case SSL_ERROR_ZERO_RETURN: - pqsecure_close(conn); SOCK_ERRNO = ECONNRESET; n = -1; break; default: printfPQExpBuffer(&conn->errorMessage, libpq_gettext("Unknown SSL error code\n")); + n = -1; break; } } @@ -334,21 +338,25 @@ pqsecure_write(PGconn *conn, const void *ptr, size_t len) libpq_gettext("SSL SYSCALL error: %s\n"), SOCK_STRERROR(SOCK_ERRNO)); else + { printfPQExpBuffer(&conn->errorMessage, libpq_gettext("SSL SYSCALL error: EOF detected\n")); + SOCK_ERRNO = ECONNRESET; + n = -1; + } break; case SSL_ERROR_SSL: printfPQExpBuffer(&conn->errorMessage, libpq_gettext("SSL error: %s\n"), SSLerrmessage()); /* fall through */ case SSL_ERROR_ZERO_RETURN: - pqsecure_close(conn); SOCK_ERRNO = ECONNRESET; n = -1; break; default: printfPQExpBuffer(&conn->errorMessage, libpq_gettext("Unknown SSL error code\n")); + n = -1; break; } }