lib/tevent: a cleaner fix for be4ac227842530d484659f2db683453366326d8b segv
authorRusty Russell <rusty@rustcorp.com.au>
Tue, 22 Sep 2009 01:02:10 +0000 (10:32 +0930)
committerVolker Lendecke <vl@samba.org>
Tue, 22 Sep 2009 08:50:28 +0000 (10:50 +0200)
Revert 23abcd2318c69753aa2a144e1dc0f9cf9efdb705 and fix logic bug.

The current code loops through the event contexts, when it sees a different
one, it notifies the current one (ev) and updates ev to point to the new one.

This is dumb, because:
(1) ev starts as NULL, so this code crashes, and
(2) The final context will not be notified.

The correct fix for this is to update ev to the new one, then notify it.
Volker's fix works because we currently always have one event context.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
lib/tevent/tevent_signal.c

index 0ca2a2760b0338112a1f3ebaa9cceb1ec857cabc..d3325b67ac06a4dced5c96307299bd352325d7ef 100644 (file)
@@ -90,18 +90,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) {
+                       ev = sl->se->event_ctx;
                        /* doesn't matter if this pipe overflows */
                        res = write(ev->pipe_fds[1], &c, 1);
-                       ev = sl->se->event_ctx;
                }
        }