summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRusty Russell <rusty@rustcorp.com.au>2009-08-28 12:04:22 +0930
committerKarolin Seeger <kseeger@samba.org>2009-09-09 12:45:07 +0200
commitc1011b3a21298fcde7a81a23412b3e2450e15942 (patch)
tree39cb166843cca1db0d2fd63a94fae8d24f6da8bf
parentce31ae860d25823f7b5b3140b74e8d83af9d6ed5 (diff)
downloadsamba-c1011b3a21298fcde7a81a23412b3e2450e15942.tar.gz
lib/tevent: fix race with signals and tevent_common_add_signal
We carefully preserve the old signal handler, but we replace it before we've set up everything; in particular, if we fail setting up the pipe_hack we could write a NUL char to stdout (fd 0), instead of calling the old signal handler. Replace the signal handler as the very last thing we do. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> (cherry picked from commit 6abb637e3e0d23635fdbbb91c163731b325d696d) (cherry picked from commit bd28ae54a635667096e4a0d1010a1c3cce59712f)
-rw-r--r--lib/tevent/tevent_signal.c40
1 files changed, 20 insertions, 20 deletions
diff --git a/lib/tevent/tevent_signal.c b/lib/tevent/tevent_signal.c
index 429995318be..2c87463b95d 100644
--- a/lib/tevent/tevent_signal.c
+++ b/lib/tevent/tevent_signal.c
@@ -219,6 +219,26 @@ struct tevent_signal *tevent_common_add_signal(struct tevent_context *ev,
return NULL;
}
+ /* we need to setup the pipe hack handler if not already
+ setup */
+ if (ev->pipe_fde == NULL) {
+ if (sig_state->pipe_hack[0] == 0 &&
+ sig_state->pipe_hack[1] == 0) {
+ if (pipe(sig_state->pipe_hack) == -1) {
+ talloc_free(se);
+ return NULL;
+ }
+ ev_set_blocking(sig_state->pipe_hack[0], false);
+ ev_set_blocking(sig_state->pipe_hack[1], false);
+ }
+ ev->pipe_fde = tevent_add_fd(ev, ev, sig_state->pipe_hack[0],
+ TEVENT_FD_READ, signal_pipe_handler, NULL);
+ if (!ev->pipe_fde) {
+ talloc_free(se);
+ return NULL;
+ }
+ }
+
/* only install a signal handler if not already installed */
if (sig_state->sig_handlers[signum] == NULL) {
struct sigaction act;
@@ -255,26 +275,6 @@ struct tevent_signal *tevent_common_add_signal(struct tevent_context *ev,
talloc_set_destructor(se, tevent_signal_destructor);
talloc_set_destructor(sl, tevent_common_signal_list_destructor);
- /* we need to setup the pipe hack handler if not already
- setup */
- if (ev->pipe_fde == NULL) {
- if (sig_state->pipe_hack[0] == 0 &&
- sig_state->pipe_hack[1] == 0) {
- if (pipe(sig_state->pipe_hack) == -1) {
- talloc_free(se);
- return NULL;
- }
- ev_set_blocking(sig_state->pipe_hack[0], false);
- ev_set_blocking(sig_state->pipe_hack[1], false);
- }
- ev->pipe_fde = tevent_add_fd(ev, ev, sig_state->pipe_hack[0],
- TEVENT_FD_READ, signal_pipe_handler, NULL);
- if (!ev->pipe_fde) {
- talloc_free(se);
- return NULL;
- }
- }
-
return se;
}