ssl-read-commerr-v2.patch
application/octet-stream
Filename: ssl-read-commerr-v2.patch
Type: application/octet-stream
Part: 0
Patch
Format: unified
Series: patch v2
| File | + | − |
|---|---|---|
| src/backend/libpq/be-secure.c | 4 | 0 |
| src/backend/libpq/be-secure-openssl.c | 8 | 4 |
| src/interfaces/libpq/fe-secure-openssl.c | 6 | 10 |
diff --git a/src/backend/libpq/be-secure-openssl.c b/src/backend/libpq/be-secure-openssl.c
index 44c84a7869..5aace0eb78 100644
--- a/src/backend/libpq/be-secure-openssl.c
+++ b/src/backend/libpq/be-secure-openssl.c
@@ -688,11 +688,13 @@ be_tls_read(Port *port, void *ptr, size_t len, int *waitfor)
ereport(COMMERROR,
(errcode(ERRCODE_PROTOCOL_VIOLATION),
errmsg("SSL error: %s", SSLerrmessage(ecode))));
- /* fall through */
- case SSL_ERROR_ZERO_RETURN:
errno = ECONNRESET;
n = -1;
break;
+ case SSL_ERROR_ZERO_RETURN:
+ /* connection was cleanly shut down by peer */
+ n = 0;
+ break;
default:
ereport(COMMERROR,
(errcode(ERRCODE_PROTOCOL_VIOLATION),
@@ -748,11 +750,13 @@ be_tls_write(Port *port, void *ptr, size_t len, int *waitfor)
ereport(COMMERROR,
(errcode(ERRCODE_PROTOCOL_VIOLATION),
errmsg("SSL error: %s", SSLerrmessage(ecode))));
- /* fall through */
- case SSL_ERROR_ZERO_RETURN:
errno = ECONNRESET;
n = -1;
break;
+ case SSL_ERROR_ZERO_RETURN:
+ /* connection was cleanly shut down by peer */
+ n = 0;
+ break;
default:
ereport(COMMERROR,
(errcode(ERRCODE_PROTOCOL_VIOLATION),
diff --git a/src/backend/libpq/be-secure.c b/src/backend/libpq/be-secure.c
index 785dadb6c2..655810e436 100644
--- a/src/backend/libpq/be-secure.c
+++ b/src/backend/libpq/be-secure.c
@@ -235,6 +235,10 @@ secure_raw_read(Port *port, void *ptr, size_t len)
/*
* Write data to a secure connection.
+ *
+ * be_tls_write() can return 0 to caller if connection has been reset cleanly
+ * by peer when using a SSL connection, unlike its counterpart in
+ * secure_raw_write().
*/
ssize_t
secure_write(Port *port, void *ptr, size_t len)
diff --git a/src/interfaces/libpq/fe-secure-openssl.c b/src/interfaces/libpq/fe-secure-openssl.c
index a7c3d7af64..08f122cbe6 100644
--- a/src/interfaces/libpq/fe-secure-openssl.c
+++ b/src/interfaces/libpq/fe-secure-openssl.c
@@ -261,12 +261,10 @@ rloop:
/*
* Per OpenSSL documentation, this error code is only returned for
* a clean connection closure, so we should not report it as a
- * server crash.
+ * server crash. Similarly to the non-SSL code path, this is
+ * equivalent to nothing received to adapt accordindly.
*/
- printfPQExpBuffer(&conn->errorMessage,
- libpq_gettext("SSL connection has been closed unexpectedly\n"));
- result_errno = ECONNRESET;
- n = -1;
+ n = 0;
break;
default:
printfPQExpBuffer(&conn->errorMessage,
@@ -370,12 +368,10 @@ pgtls_write(PGconn *conn, const void *ptr, size_t len)
/*
* Per OpenSSL documentation, this error code is only returned for
* a clean connection closure, so we should not report it as a
- * server crash.
+ * server crash. Similarly to the non-SSL code path, this is
+ * equivalent to nothing sent to adapt accordindly.
*/
- printfPQExpBuffer(&conn->errorMessage,
- libpq_gettext("SSL connection has been closed unexpectedly\n"));
- result_errno = ECONNRESET;
- n = -1;
+ n = 0;
break;
default:
printfPQExpBuffer(&conn->errorMessage,