Commit 9d118277 authored by Nick Mathewson's avatar Nick Mathewson 🐛
Browse files

Fix a rare infinite-recursion bug when shutting down.

Once we had called log_free_all(), anything that tried to log a
message (like a failed tor_assert()) would fail like this:

   1. The logging call eventually invokes the _log() function.
   2. _log() calls tor_mutex_lock(log_mutex).
   3. tor_mutex_lock(m) calls tor_assert(m).
   4. Since we freed the log_mutex, tor_assert() fails, and tries to
      log its failure.
   5. GOTO 1.

Now we allocate the mutex statically, and never destroy it on

Bugfix on, which introduced the log mutex.

This bug was found by Matt Edman.
parent c9b8a4a1
......@@ -15,6 +15,9 @@ Changes in version - 2009-??-??
- Fix a signed/unsigned compile warning in
- Fix possible segmentation fault on directory authorities. Bugfix on
- Fix an extremely infinite recursion bug that could occur if we tried
to log a message after shutting down the log subsystem. Found by Matt
Edman. Bugfix on
Changes in version - 2009-07-28
......@@ -94,7 +94,8 @@ should_log_function_name(log_domain_mask_t domain, int severity)
/** A mutex to guard changes to logfiles and logging. */
static tor_mutex_t *log_mutex = NULL;
static tor_mutex_t log_mutex;
static int log_mutex_initialized = 0;
/** Linked list of logfile_t. */
static logfile_t *logfiles = NULL;
......@@ -105,9 +106,9 @@ static int syslog_count = 0;
tor_mutex_acquire(log_mutex); \
tor_mutex_acquire(&log_mutex); \
#define UNLOCK_LOGS() STMT_BEGIN tor_mutex_release(log_mutex); STMT_END
#define UNLOCK_LOGS() STMT_BEGIN tor_mutex_release(&log_mutex); STMT_END
/** What's the lowest log level anybody cares about? Checking this lets us
* bail out early from log_debug if we aren't debugging. */
......@@ -448,8 +449,9 @@ logs_free_all(void)
log_mutex = NULL;
/* We _could_ destroy the log mutex here, but that would screw up any logs
* that happened between here and the end of execution. */
/** Remove and free the log entry <b>victim</b> from the linked-list
......@@ -545,8 +547,10 @@ add_stream_log(const log_severity_list_t *severity,
if (!log_mutex)
log_mutex = tor_mutex_new();
if (!log_mutex_initialized) {
log_mutex_initialized = 1;
/** Add a log handler to receive messages during startup (before the real
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment