Commit 9492424d authored by Nick Mathewson's avatar Nick Mathewson 🦞
Browse files

Per comments at the bottom of openssl/FAQ, call even more functions to

clean up OpenSSL's toys when it's done playing.  (Why isn't there an
OpenSSL_free_everything() function?)


svn:r5321
parent b39d0311
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ const char crypto_c_id[] = "$Id$";
#include <openssl/dh.h>
#include <openssl/rsa.h>
#include <openssl/dh.h>
#include <openssl/conf.h>

#include <stdlib.h>
#include <assert.h>
@@ -220,16 +221,26 @@ crypto_global_init(int useAccel)
  return 0;
}

/** Free crypto resources held by this thread. */
void
crypto_thread_cleanup(void)
{
  ERR_remove_state(0);
}

/** Uninitialize the crypto library. Return 0 on success, -1 on failure.
 */
int
crypto_global_cleanup(void)
{
  EVP_cleanup();
  //ERR_remove_state(0);
  ERR_free_strings();
#ifndef NO_ENGINES
  ENGINE_cleanup();
#endif
  CONF_modules_unload(1);
  CRYPTO_cleanup_all_ex_data();
#ifdef TOR_IS_MULTITHREADED
  if (_n_openssl_mutexes) {
    int n = _n_openssl_mutexes;
+1 −0
Original line number Diff line number Diff line
@@ -53,6 +53,7 @@ typedef struct crypto_dh_env_t crypto_dh_env_t;

/* global state */
int crypto_global_init(int hardwareAccel);
void crypto_thread_cleanup(void);
int crypto_global_cleanup(void);

/* environment setup */
+1 −0
Original line number Diff line number Diff line
@@ -290,6 +290,7 @@ cpuworker_main(void *data)
  if (last_onion_key)
    crypto_free_pk_env(last_onion_key);
  tor_close_socket(fd);
  crypto_thread_cleanup();
  spawn_exit();
  return 0; /* windows wants this function to return an int */
}
+3 −0
Original line number Diff line number Diff line
@@ -793,12 +793,14 @@ dnsworker_main(void *data)
        info(LD_EXIT,"(Error on %d was %s)", fd, tor_socket_strerror(tor_socket_errno(fd)));
      }
      tor_close_socket(fd);
      crypto_thread_cleanup();
      spawn_exit();
    }

    if (address_len && read_all(fd, address, address_len, 1) != address_len) {
      err(LD_BUG,"read hostname failed. Child exiting.");
      tor_close_socket(fd);
      crypto_thread_cleanup();
      spawn_exit();
    }
    address[address_len] = 0; /* null terminate it */
@@ -826,6 +828,7 @@ dnsworker_main(void *data)
    if (write_all(fd, answer, 5, 1) != 5) {
      err(LD_NET,"writing answer failed. Child exiting.");
      tor_close_socket(fd);
      crypto_thread_cleanup();
      spawn_exit();
    }
  }