Explicitly shut the socket down in s_client
authorBernd Edlinger <bernd.edlinger@hotmail.de>
Sat, 13 Jan 2018 17:41:08 +0000 (18:41 +0100)
committerBernd Edlinger <bernd.edlinger@hotmail.de>
Sun, 14 Jan 2018 17:17:39 +0000 (18:17 +0100)
Reviewed-by: Richard Levitte <levitte@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/5072)

apps/s_client.c

index fcab44cb569a14f356e84fc070949ac751fac6ca..a549304b346a5afb1a8664bf8ed35098c8ec9719 100644 (file)
@@ -3035,6 +3035,17 @@ int s_client_main(int argc, char **argv)
      */
     Sleep(50);
 #endif
+    /*
+     * If we ended with an alert being sent, but still with data in the
+     * network buffer to be read, then calling BIO_closesocket() will
+     * result in a TCP-RST being sent. On some platforms (notably
+     * Windows) then this will result in the peer immediately abandoning
+     * the connection including any buffered alert data before it has
+     * had a chance to be read. Shutting down the sending side first,
+     * and then closing the socket sends TCP-FIN first followed by
+     * TCP-RST. This seems to allow the peer to read the alert data.
+     */
+    shutdown(SSL_get_fd(con), 1); /* SHUT_WR */
     BIO_closesocket(SSL_get_fd(con));
  end:
     if (con != NULL) {