瀏覽代碼

Try a little harder to avoid openssl SSL* double-free reports.

svn:r3710
Nick Mathewson 20 年之前
父節點
當前提交
97bc49bd72
共有 3 個文件被更改,包括 7 次插入3 次删除
  1. 3 1
      src/common/tortls.c
  2. 3 1
      src/or/connection.c
  3. 1 1
      src/or/main.c

+ 3 - 1
src/common/tortls.c

@@ -436,8 +436,10 @@ tor_tls_new(int sock, int isServer, int use_no_cert)
 void
 tor_tls_free(tor_tls *tls)
 {
+  tor_assert(tls && tls->ssl);
   SSL_free(tls->ssl);
-  free(tls);
+  tls->ssl = NULL;
+  tor_free(tls);
 }
 
 /** Underlying function for TLS reading.  Reads up to <b>len</b>

+ 3 - 1
src/or/connection.c

@@ -170,8 +170,10 @@ _connection_free(connection_t *conn) {
   if (connection_speaks_cells(conn)) {
     if (conn->state == OR_CONN_STATE_OPEN)
       directory_set_dirty();
-    if (conn->tls)
+    if (conn->tls) {
       tor_tls_free(conn->tls);
+      conn->tls = NULL;
+    }
   }
 
   if (conn->identity_pkey)

+ 1 - 1
src/or/main.c

@@ -1276,10 +1276,10 @@ void tor_cleanup(void) {
    * unlink, nothing we could do about it anyways. */
   if (options->PidFile && options->command == CMD_RUN_TOR)
     unlink(options->PidFile);
-  crypto_global_cleanup();
   if (accounting_is_enabled(options))
     accounting_record_bandwidth_usage(time(NULL));
   tor_free_all(); /* move tor_free_all back into the ifdef below later. XXX*/
+  crypto_global_cleanup();
 #ifdef USE_DMALLOC
   dmalloc_log_unfreed();
   dmalloc_shutdown();