diff options
author | Tom Lane | 2003-08-04 17:25:29 +0000 |
---|---|---|
committer | Tom Lane | 2003-08-04 17:25:29 +0000 |
commit | 5365a0cf52189e4c62b98077fc805f3d8a2b15b9 (patch) | |
tree | 1dff246adc6130da8a06757f3e2f5c505560bc02 | |
parent | a4ffca6bdfea4df003f6ffd044b575fabd7e084b (diff) |
Fix some more problems with testing error returns from SSL.
-rw-r--r-- | src/interfaces/libpq/fe-misc.c | 13 | ||||
-rw-r--r-- | src/interfaces/libpq/fe-secure.c | 14 |
2 files changed, 23 insertions, 4 deletions
diff --git a/src/interfaces/libpq/fe-misc.c b/src/interfaces/libpq/fe-misc.c index f94f46dd59b..5008d5bf632 100644 --- a/src/interfaces/libpq/fe-misc.c +++ b/src/interfaces/libpq/fe-misc.c @@ -25,7 +25,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-misc.c,v 1.85 2002/10/24 23:35:55 tgl Exp $ + * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-misc.c,v 1.85.2.1 2003/08/04 17:25:28 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -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 2a4d394187d..4d3ffcc5b8e 100644 --- a/src/interfaces/libpq/fe-secure.c +++ b/src/interfaces/libpq/fe-secure.c @@ -11,7 +11,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-secure.c,v 1.15.2.5 2003/04/10 23:03:13 tgl Exp $ + * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-secure.c,v 1.15.2.6 2003/08/04 17:25:29 tgl Exp $ * * NOTES * The client *requires* a valid server certificate. Since @@ -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; } } |