diff options
-rw-r--r-- | changes/bug27861 | 4 | ||||
-rw-r--r-- | src/core/mainloop/mainloop.c | 11 | ||||
-rw-r--r-- | src/test/test_periodic_event.c | 8 |
3 files changed, 16 insertions, 7 deletions
diff --git a/changes/bug27861 b/changes/bug27861 new file mode 100644 index 0000000000..377d68e320 --- /dev/null +++ b/changes/bug27861 @@ -0,0 +1,4 @@ + o Major bugfixes (initialization, crash): + - Fix an assertion crash that would stop Tor from starting up if + the code tried to activate a periodic event too early. Fixes bug + 27861; bugfix on 0.3.5.1-alpha. diff --git a/src/core/mainloop/mainloop.c b/src/core/mainloop/mainloop.c index 4a9da43c9c..6e7033ec4b 100644 --- a/src/core/mainloop/mainloop.c +++ b/src/core/mainloop/mainloop.c @@ -1535,7 +1535,9 @@ initialize_periodic_events_cb(evutil_socket_t fd, short events, void *data) STATIC void initialize_periodic_events(void) { - tor_assert(periodic_events_initialized == 0); + if (periodic_events_initialized) + return; + periodic_events_initialized = 1; /* Set up all periodic events. We'll launch them by roles. */ @@ -2682,6 +2684,8 @@ dns_servers_relaunch_checks(void) void initialize_mainloop_events(void) { + initialize_periodic_events(); + if (!schedule_active_linked_connections_event) { schedule_active_linked_connections_event = mainloop_event_postloop_new(schedule_active_linked_connections_cb, NULL); @@ -2699,10 +2703,7 @@ do_main_loop(void) /* initialize the periodic events first, so that code that depends on the * events being present does not assert. */ - if (! periodic_events_initialized) { - initialize_periodic_events(); - } - + initialize_periodic_events(); initialize_mainloop_events(); /* set up once-a-second callback. */ diff --git a/src/test/test_periodic_event.c b/src/test/test_periodic_event.c index 7804a9d8fb..86dedd85d8 100644 --- a/src/test/test_periodic_event.c +++ b/src/test/test_periodic_event.c @@ -87,15 +87,19 @@ test_pe_launch(void *arg) item->fn = dumb_event_fn; } - /* Lets make sure that before intialization, we can't scan the periodic - * events list and launch them. Lets try by being a Client. */ options = get_options_mutable(); options->SocksPort_set = 1; periodic_events_on_new_options(options); +#if 0 + /* Lets make sure that before intialization, we can't scan the periodic + * events list and launch them. Lets try by being a Client. */ + /* XXXX We make sure these events are initialized now way earlier than we + * did before. */ for (int i = 0; periodic_events[i].name; ++i) { periodic_event_item_t *item = &periodic_events[i]; tt_int_op(periodic_event_is_enabled(item), OP_EQ, 0); } +#endif initialize_periodic_events(); |