mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-10 13:13:44 +01:00
Rewrite control_event_signal() to use signal_table.
When we added the ACTIVE and DORMANT virtual signals, we taught the signal command to handle them, but we didn't teach SIGNAL event to report them. To solve this problem and prevent it from recurring, this patch revises the implementation of control_event_signal() to use the same signal_table that handle_control_signal() uses. This way, the two controller commands can't become out of sync. Fixes bug 33104; bugfix on 0.4.0.1-alpha.
This commit is contained in:
parent
ec7f99e6ef
commit
7bd671811e
4
changes/bug33104
Normal file
4
changes/bug33104
Normal file
@ -0,0 +1,4 @@
|
||||
o Minor bugfixes (controller):
|
||||
- When receiving "ACTIVE" or "DORMANT" signals on the control port,
|
||||
report them as SIGNAL events. Fixes bug 33104; bugfix on
|
||||
0.4.0.1-alpha.
|
@ -158,6 +158,10 @@ control_ports_write_to_file(void)
|
||||
}
|
||||
|
||||
const struct signal_name_t signal_table[] = {
|
||||
/* NOTE: this table is used for handling SIGNAL commands and generating
|
||||
* SIGNAL events. Order is significant: if there are two entries for the
|
||||
* same numeric signal, the first one is the canonical name generated
|
||||
* for the events. */
|
||||
{ SIGHUP, "RELOAD" },
|
||||
{ SIGHUP, "HUP" },
|
||||
{ SIGINT, "SHUTDOWN" },
|
||||
|
@ -1552,29 +1552,17 @@ control_event_signal(uintptr_t signal_num)
|
||||
if (!control_event_is_interesting(EVENT_GOT_SIGNAL))
|
||||
return 0;
|
||||
|
||||
switch (signal_num) {
|
||||
case SIGHUP:
|
||||
signal_string = "RELOAD";
|
||||
for (unsigned i = 0; signal_table[i].signal_name != NULL; ++i) {
|
||||
if ((int)signal_num == signal_table[i].sig) {
|
||||
signal_string = signal_table[i].signal_name;
|
||||
break;
|
||||
case SIGUSR1:
|
||||
signal_string = "DUMP";
|
||||
break;
|
||||
case SIGUSR2:
|
||||
signal_string = "DEBUG";
|
||||
break;
|
||||
case SIGNEWNYM:
|
||||
signal_string = "NEWNYM";
|
||||
break;
|
||||
case SIGCLEARDNSCACHE:
|
||||
signal_string = "CLEARDNSCACHE";
|
||||
break;
|
||||
case SIGHEARTBEAT:
|
||||
signal_string = "HEARTBEAT";
|
||||
break;
|
||||
default:
|
||||
log_warn(LD_BUG, "Unrecognized signal %lu in control_event_signal",
|
||||
(unsigned long)signal_num);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (signal_string == NULL) {
|
||||
log_warn(LD_BUG, "Unrecognized signal %lu in control_event_signal",
|
||||
(unsigned long)signal_num);
|
||||
return -1;
|
||||
}
|
||||
|
||||
send_control_event(EVENT_GOT_SIGNAL, "650 SIGNAL %s\r\n",
|
||||
|
Loading…
Reference in New Issue
Block a user