mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-10 21:23:58 +01:00
Do not send Libevent log messages to a controller (0.2.1 backport)
Doing so could make Libevent call Libevent from inside a Libevent logging call, which is a recipe for reentrant confusion and hard-to-debug crashes. This would especially hurt if Libevent debug-level logging is enabled AND the user has a controller watching for low-severity log messages. Fix bug 2190; fix on 0.1.0.2-rc.
This commit is contained in:
parent
566a115be1
commit
668f7a2639
6
changes/bug2190
Normal file
6
changes/bug2190
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
o Minor bugfixes
|
||||||
|
- Prevent calls from Libevent from inside Libevent log handlers.
|
||||||
|
This had potential to cause a nasty set of crashes, especially if
|
||||||
|
running Libevent with debug logging enabled, and running Tor
|
||||||
|
with a controller watching for low-severity log messages.
|
||||||
|
Bugfix on 0.1.0.2-rc. Fixes bug 2190.
|
@ -280,6 +280,10 @@ logv(int severity, log_domain_mask_t domain, const char *funcname,
|
|||||||
lf = lf->next;
|
lf = lf->next;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (lf->callback && (domain & LD_NOCB)) {
|
||||||
|
lf = lf->next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (lf->seems_dead) {
|
if (lf->seems_dead) {
|
||||||
lf = lf->next;
|
lf = lf->next;
|
||||||
continue;
|
continue;
|
||||||
@ -943,19 +947,19 @@ libevent_logging_callback(int severity, const char *msg)
|
|||||||
}
|
}
|
||||||
switch (severity) {
|
switch (severity) {
|
||||||
case _EVENT_LOG_DEBUG:
|
case _EVENT_LOG_DEBUG:
|
||||||
log(LOG_DEBUG, LD_NET, "Message from libevent: %s", buf);
|
log(LOG_DEBUG, LD_NOCB|LD_NET, "Message from libevent: %s", buf);
|
||||||
break;
|
break;
|
||||||
case _EVENT_LOG_MSG:
|
case _EVENT_LOG_MSG:
|
||||||
log(LOG_INFO, LD_NET, "Message from libevent: %s", buf);
|
log(LOG_INFO, LD_NOCB|LD_NET, "Message from libevent: %s", buf);
|
||||||
break;
|
break;
|
||||||
case _EVENT_LOG_WARN:
|
case _EVENT_LOG_WARN:
|
||||||
log(LOG_WARN, LD_GENERAL, "Warning from libevent: %s", buf);
|
log(LOG_WARN, LD_NOCB|LD_GENERAL, "Warning from libevent: %s", buf);
|
||||||
break;
|
break;
|
||||||
case _EVENT_LOG_ERR:
|
case _EVENT_LOG_ERR:
|
||||||
log(LOG_ERR, LD_GENERAL, "Error from libevent: %s", buf);
|
log(LOG_ERR, LD_NOCB|LD_GENERAL, "Error from libevent: %s", buf);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
log(LOG_WARN, LD_GENERAL, "Message [%d] from libevent: %s",
|
log(LOG_WARN, LD_NOCB|LD_GENERAL, "Message [%d] from libevent: %s",
|
||||||
severity, buf);
|
severity, buf);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -94,6 +94,10 @@
|
|||||||
/** Number of logging domains in the code. */
|
/** Number of logging domains in the code. */
|
||||||
#define N_LOGGING_DOMAINS 19
|
#define N_LOGGING_DOMAINS 19
|
||||||
|
|
||||||
|
/** This log message is not safe to send to a callback-based logger.
|
||||||
|
* Used as a flag, not a log domain. */
|
||||||
|
#define LD_NOCB (1u<<31)
|
||||||
|
|
||||||
typedef uint32_t log_domain_mask_t;
|
typedef uint32_t log_domain_mask_t;
|
||||||
|
|
||||||
/** Configures which severities are logged for each logging domain for a given
|
/** Configures which severities are logged for each logging domain for a given
|
||||||
|
Loading…
Reference in New Issue
Block a user