diff options
author | Volker Lendecke <vl@samba.org> | 2009-08-29 09:41:32 +0200 |
---|---|---|
committer | Volker Lendecke <vl@samba.org> | 2009-08-29 09:49:08 +0200 |
commit | 23abcd2318c69753aa2a144e1dc0f9cf9efdb705 (patch) | |
tree | 23cc1b28b16184a5861f990bd5af73cb625b2cfa /lib/tevent | |
parent | c1b8eb884b71727fa12f4f62e0261c07b47c943a (diff) | |
download | samba-23abcd2318c69753aa2a144e1dc0f9cf9efdb705.tar.gz samba-23abcd2318c69753aa2a144e1dc0f9cf9efdb705.tar.bz2 samba-23abcd2318c69753aa2a144e1dc0f9cf9efdb705.zip |
tevent: Fix a segfault upon the first signal
When the first signal arrives, tevent_common_signal_handler() crashed: "ev" is
initialized to NULL, so the first "write(ev->pipe_fds[1], &c, 1);" dereferences
NULL.
Rusty, Tridge, please check. Also, can you tell me a bit more about the
environment you tested this in? I'd be curious to see where this survived.
Thanks,
Volker
Diffstat (limited to 'lib/tevent')
-rw-r--r-- | lib/tevent/tevent_signal.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/lib/tevent/tevent_signal.c b/lib/tevent/tevent_signal.c index 0333325ef0..b329f8c1e7 100644 --- a/lib/tevent/tevent_signal.c +++ b/lib/tevent/tevent_signal.c @@ -85,6 +85,12 @@ static void tevent_common_signal_handler(int signum) SIG_INCREMENT(sig_state->signal_count[signum]); SIG_INCREMENT(sig_state->got_signal); + if (sig_state->sig_handlers[signum] != NULL) { + ev = sig_state->sig_handlers[signum]->se->event_ctx; + /* doesn't matter if this pipe overflows */ + res = write(ev->pipe_fds[1], &c, 1); + } + /* Write to each unique event context. */ for (sl = sig_state->sig_handlers[signum]; sl; sl = sl->next) { if (sl->se->event_ctx != ev) { |