summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2018-01-11 12:45:25 -0500
committerNick Mathewson <nickm@torproject.org>2018-01-11 12:45:25 -0500
commit05ac3d0458466bd8ffc69339a4bf8e34088d9d80 (patch)
tree18741abb304de4419862314d9da2fa40aec900c4 /src
parent751595551afb6282d952c482a11db35daf3736ab (diff)
parent3b465ebf2eedecfa0659f91a6ed7dc667e7acde7 (diff)
downloadtor-05ac3d0458466bd8ffc69339a4bf8e34088d9d80.tar.gz
tor-05ac3d0458466bd8ffc69339a4bf8e34088d9d80.zip
Merge branch 'restart_nocrash'
Diffstat (limited to 'src')
-rw-r--r--src/common/compat_libevent.c10
-rw-r--r--src/common/compat_libevent.h1
-rw-r--r--src/common/crypto.c2
-rw-r--r--src/or/config.c4
-rw-r--r--src/or/main.c1
-rw-r--r--src/or/tor_api.h5
6 files changed, 20 insertions, 3 deletions
diff --git a/src/common/compat_libevent.c b/src/common/compat_libevent.c
index 10489bf296..b5e9cc9332 100644
--- a/src/common/compat_libevent.c
+++ b/src/common/compat_libevent.c
@@ -237,6 +237,16 @@ tor_init_libevent_rng(void)
return rv;
}
+/**
+ * Un-initialize libevent in preparation for an exit
+ */
+void
+tor_libevent_free_all(void)
+{
+ event_base_free(the_event_base);
+ the_event_base = NULL;
+}
+
#if defined(LIBEVENT_VERSION_NUMBER) && \
LIBEVENT_VERSION_NUMBER >= V(2,1,1) && \
!defined(TOR_UNIT_TESTS)
diff --git a/src/common/compat_libevent.h b/src/common/compat_libevent.h
index 0cdb73fbb9..1853e50917 100644
--- a/src/common/compat_libevent.h
+++ b/src/common/compat_libevent.h
@@ -52,6 +52,7 @@ const char *tor_libevent_get_method(void);
void tor_check_libevent_header_compatibility(void);
const char *tor_libevent_get_version_str(void);
const char *tor_libevent_get_header_version_str(void);
+void tor_libevent_free_all(void);
int tor_init_libevent_rng(void);
diff --git a/src/common/crypto.c b/src/common/crypto.c
index 4faf7c6838..85bed538e5 100644
--- a/src/common/crypto.c
+++ b/src/common/crypto.c
@@ -3470,6 +3470,8 @@ crypto_global_cleanup(void)
if (dh_param_g)
BN_clear_free(dh_param_g);
+ dh_param_p = dh_param_p_tls = dh_param_g = NULL;
+
#ifndef DISABLE_ENGINES
ENGINE_cleanup();
#endif
diff --git a/src/or/config.c b/src/or/config.c
index 7bc811e859..e5c10498c4 100644
--- a/src/or/config.c
+++ b/src/or/config.c
@@ -805,6 +805,8 @@ static smartlist_t *configured_ports = NULL;
/** True iff we're currently validating options, and any calls to
* get_options() are likely to be bugs. */
static int in_option_validation = 0;
+/* True iff we've initialized libevent */
+static int libevent_initialized = 0;
/** Return the contents of our frontpage string, or NULL if not configured. */
MOCK_IMPL(const char*,
@@ -995,6 +997,7 @@ config_free_all(void)
tor_free(the_tor_version);
have_parsed_cmdline = 0;
+ libevent_initialized = 0;
}
/** Make <b>address</b> -- a piece of information related to our operation as
@@ -1345,7 +1348,6 @@ options_act_reversible(const or_options_t *old_options, char **msg)
{
smartlist_t *new_listeners = smartlist_new();
smartlist_t *replaced_listeners = smartlist_new();
- static int libevent_initialized = 0;
or_options_t *options = get_options_mutable();
int running_tor = options->command == CMD_RUN_TOR;
int set_conn_limit = 0;
diff --git a/src/or/main.c b/src/or/main.c
index fe31f0ed0b..5d4825ca95 100644
--- a/src/or/main.c
+++ b/src/or/main.c
@@ -3478,6 +3478,7 @@ tor_free_all(int postfork)
if (!postfork) {
release_lockfile();
}
+ tor_libevent_free_all();
/* Stuff in util.c and address.c*/
if (!postfork) {
escaped(NULL);
diff --git a/src/or/tor_api.h b/src/or/tor_api.h
index b12ed718c1..e7d70c2a61 100644
--- a/src/or/tor_api.h
+++ b/src/or/tor_api.h
@@ -71,8 +71,9 @@ void tor_main_configuration_free(tor_main_configuration_t *cfg);
* fix it.
*
* BUG 23847: You can only call tor_main() once in a single process; if it
- * returns and you call it again, you may crash. This is not intended
- * long-term behavior; we are trying to fix it.
+ * returns and you call it again, you may crash, or you may encounter other
+ * unexpected behavior. This is not intended long-term behavior; we are
+ * trying to fix it.
*
* LIMITATION: You cannot run more than one instance of Tor in the same
* process at the same time. Concurrent calls will cause undefined behavior.