]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Use tor_tls_release_socket() to avoid double-closed sockets on NSS
authorNick Mathewson <nickm@torproject.org>
Wed, 12 Sep 2018 15:32:15 +0000 (11:32 -0400)
committerNick Mathewson <nickm@torproject.org>
Wed, 12 Sep 2018 15:32:15 +0000 (11:32 -0400)
Closes ticket 27451; bug not in any released Tor.

src/core/mainloop/connection.c

index ffc9010fb8b4b19fcab9fab13ea39e5dfb7b6ec6..16ce8b3f2a8334c852617f86e805b1da80d7c1c0 100644 (file)
@@ -638,8 +638,19 @@ connection_free_minimal(connection_t *conn)
 
   if (connection_speaks_cells(conn)) {
     or_connection_t *or_conn = TO_OR_CONN(conn);
-    tor_tls_free(or_conn->tls);
-    or_conn->tls = NULL;
+    if (or_conn->tls) {
+      if (! SOCKET_OK(conn->s)) {
+        /* The socket has been closed by somebody else; we must tell the
+         * TLS object not to close it. */
+        tor_tls_release_socket(or_conn->tls);
+      } else {
+        /* The tor_tls_free() call below will close the socket; we must tell
+         * the code below not to close it a second time. */
+        conn->s = TOR_INVALID_SOCKET;
+      }
+      tor_tls_free(or_conn->tls);
+      or_conn->tls = NULL;
+    }
     or_handshake_state_free(or_conn->handshake_state);
     or_conn->handshake_state = NULL;
     tor_free(or_conn->nickname);