Add an option to disable signal handler installation.

Closes ticket 24588.
This commit is contained in:
Nick Mathewson 2017-12-15 12:48:29 -05:00
parent fdd5734875
commit 20f802ea3c
4 changed files with 20 additions and 1 deletions

5
changes/ticket24588 Normal file
View File

@ -0,0 +1,5 @@
o Minor features (embedding, mobile):
- Applications that want to embed Tor can now tell Tor not to register
any of its own POSIX signal handlers, using the __DisableSignalHandlers
option. This option is not meant for general use. Closes ticket 24588.

View File

@ -564,6 +564,7 @@ static config_var_t option_vars_[] = {
VAR("__ReloadTorrcOnSIGHUP", BOOL, ReloadTorrcOnSIGHUP, "1"),
VAR("__AllDirActionsPrivate", BOOL, AllDirActionsPrivate, "0"),
VAR("__DisablePredictedCircuits",BOOL,DisablePredictedCircuits, "0"),
VAR("__DisableSignalHandlers", BOOL, DisableSignalHandlers, "0"),
VAR("__LeaveStreamsUnattached",BOOL, LeaveStreamsUnattached, "0"),
VAR("__HashedControlSessionPassword", LINELIST, HashedControlSessionPassword,
NULL),
@ -4652,6 +4653,12 @@ options_transition_allowed(const or_options_t *old,
return -1;
}
if (old->DisableSignalHandlers != new_val->DisableSignalHandlers) {
*msg = tor_strdup("While Tor is running, changing DisableSignalHandlers "
"is not allowed.");
return -1;
}
if (strcmp(old->DataDirectory,new_val->DataDirectory)!=0) {
tor_asprintf(msg,
"While Tor is running, changing DataDirectory "

View File

@ -3057,8 +3057,10 @@ void
handle_signals(void)
{
int i;
const int enabled = !get_options()->DisableSignalHandlers;
for (i = 0; signal_handlers[i].signal_value >= 0; ++i) {
if (signal_handlers[i].try_to_register) {
if (enabled && signal_handlers[i].try_to_register) {
signal_handlers[i].signal_event =
tor_evsignal_new(tor_libevent_get_base(),
signal_handlers[i].signal_value,

View File

@ -4651,6 +4651,11 @@ typedef struct {
/** List of files that were opened by %include in torrc and torrc-defaults */
smartlist_t *FilesOpenedByIncludes;
/** If true, Tor shouldn't install any posix signal handlers, since it is
* running embedded inside another process.
*/
int DisableSignalHandlers;
} or_options_t;
#define LOG_PROTOCOL_WARN (get_protocol_warning_severity_level())