Browse Source

In channelpadding tests that touch libevent, call event_reinit().

This is necessary to avoid crashes and test failures on kevent-based
systems.

Fixes bug 22209; bug not in any released Tor.
Nick Mathewson 7 years ago
parent
commit
95fa7d1cf8
3 changed files with 17 additions and 0 deletions
  1. 9 0
      src/common/compat_libevent.c
  2. 1 0
      src/common/compat_libevent.h
  3. 7 0
      src/test/test_channelpadding.c

+ 9 - 0
src/common/compat_libevent.c

@@ -280,6 +280,15 @@ tor_gettimeofday_cache_set(const struct timeval *tv)
   tor_assert(tv);
   memcpy(&cached_time_hires, tv, sizeof(*tv));
 }
+
+/** For testing: called post-fork to make libevent reinitialize
+ * kernel structures. */
+void
+tor_libevent_postfork(void)
+{
+  int r = event_reinit(tor_libevent_get_base());
+  tor_assert(r == 0);
+}
 #endif
 #endif
 

+ 1 - 0
src/common/compat_libevent.h

@@ -54,6 +54,7 @@ void tor_gettimeofday_cached(struct timeval *tv);
 void tor_gettimeofday_cache_clear(void);
 #ifdef TOR_UNIT_TESTS
 void tor_gettimeofday_cache_set(const struct timeval *tv);
+void tor_libevent_postfork(void);
 #endif
 
 #ifdef COMPAT_LIBEVENT_PRIVATE

+ 7 - 0
src/test/test_channelpadding.c

@@ -258,6 +258,9 @@ test_channelpadding_timers(void *arg)
   channelpadding_decision_t decision;
   channel_t *chans[CHANNELS_TO_TEST];
   (void)arg;
+
+  tor_libevent_postfork();
+
   connection_array = smartlist_new();
 
   monotime_init();
@@ -349,6 +352,8 @@ test_channelpadding_consensus(void *arg)
   int64_t val;
   (void)arg;
 
+  tor_libevent_postfork();
+
   /*
    * Params tested:
    *   nf_pad_before_usage
@@ -723,6 +728,8 @@ test_channelpadding_decide_to_pad_channel(void *arg)
   connection_array = smartlist_new();
   (void)arg;
 
+  tor_libevent_postfork();
+
   monotime_init();
   timers_initialize();
   setup_full_capture_of_logs(LOG_WARN);