Browse Source

On exit, free the event_base and set its pointer to NULL.

When we didn't do this before, we'd have some still-reachable memory
warnings, and we'd find ourselves crashing when we tried to
reinitialize libevent.

Part of 24581 (don't crash when restarting Tor in-process)
Nick Mathewson 6 years ago
parent
commit
322abc030e
3 changed files with 12 additions and 0 deletions
  1. 10 0
      src/common/compat_libevent.c
  2. 1 0
      src/common/compat_libevent.h
  3. 1 0
      src/or/main.c

+ 10 - 0
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)

+ 1 - 0
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);
 

+ 1 - 0
src/or/main.c

@@ -3388,6 +3388,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);