aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2021-12-07 13:34:06 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2021-12-07 13:34:15 -0500
commitea5ecdadf6eacdc1ef5c67648ebaed2efcb0d07a (patch)
tree402a1e5dfc85ecb61921b87be65787c27d357c60
parentb6360aa46ce966f77fba290637f51f5bb2de12a9 (diff)
downloadpostgresql-ea5ecdadf6eacdc1ef5c67648ebaed2efcb0d07a.tar.gz
postgresql-ea5ecdadf6eacdc1ef5c67648ebaed2efcb0d07a.zip
On Windows, also call shutdown() while closing the client socket.
Further experimentation shows that commit 6051857fc is not sufficient when using (some versions of?) OpenSSL. The reason is obscure, but calling shutdown(socket, SD_SEND) improves matters. Per testing by Andrew Dunstan and Alexander Lakhin. Back-patch as before. Discussion: https://postgr.es/m/af5e0bf3-6a61-bb97-6cba-061ddf22ff6b@dunslane.net
-rw-r--r--src/backend/libpq/pqcomm.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/src/backend/libpq/pqcomm.c b/src/backend/libpq/pqcomm.c
index 100203ef538..7e637fd7d02 100644
--- a/src/backend/libpq/pqcomm.c
+++ b/src/backend/libpq/pqcomm.c
@@ -287,7 +287,8 @@ socket_close(int code, Datum arg)
* not yet sent to the client. (This is a flat-out violation of the
* TCP RFCs, but count on Microsoft not to care about that.) To get
* the spec-compliant "graceful shutdown" behavior, we must invoke
- * closesocket() explicitly.
+ * closesocket() explicitly. When using OpenSSL, it seems that clean
+ * shutdown also requires an explicit shutdown() call.
*
* This code runs late enough during process shutdown that we should
* have finished all externally-visible shutdown activities, so that
@@ -295,6 +296,7 @@ socket_close(int code, Datum arg)
* Windows too. But it's a lot more fragile than the other way.
*/
#ifdef WIN32
+ shutdown(MyProcPort->sock, SD_SEND);
closesocket(MyProcPort->sock);
#endif