|
@@ -177,12 +177,15 @@ int crypto_global_cleanup()
|
|
|
ERR_free_strings();
|
|
|
#ifdef TOR_IS_MULTITHREADED
|
|
|
if (_n_openssl_mutexes) {
|
|
|
+ int n = _n_openssl_mutexes;
|
|
|
+ tor_mutex_t **ms = _openssl_mutexes;
|
|
|
int i;
|
|
|
- for (i=0;i<_n_openssl_mutexes;++i) {
|
|
|
- tor_mutex_free(_openssl_mutexes[i]);
|
|
|
- }
|
|
|
- tor_free(_openssl_mutexes);
|
|
|
+ _openssl_mutexes = NULL;
|
|
|
_n_openssl_mutexes = 0;
|
|
|
+ for (i=0;i<n;++i) {
|
|
|
+ tor_mutex_free(ms[i]);
|
|
|
+ }
|
|
|
+ tor_free(ms);
|
|
|
}
|
|
|
#endif
|
|
|
return 0;
|
|
@@ -1649,6 +1652,11 @@ secret_to_key(char *key_out, size_t key_out_len, const char *secret,
|
|
|
static void
|
|
|
_openssl_locking_cb(int mode, int n, const char *file, int line)
|
|
|
{
|
|
|
+ if (!_openssl_mutexes)
|
|
|
+ /* This is not a really good fix for the
|
|
|
+ * "release-freed-lock-from-separate-thread-on-shutdown" problem, but
|
|
|
+ * it can't hurt. */
|
|
|
+ return;
|
|
|
if (mode & CRYPTO_LOCK)
|
|
|
tor_mutex_acquire(_openssl_mutexes[n]);
|
|
|
else
|