]> granicus.if.org Git - libevent/commitdiff
event_reinit: always re-init signal's socketpair
authorNicholas Marriott <@nicm>
Sat, 26 Dec 2015 22:43:37 +0000 (01:43 +0300)
committerAzat Khuzhin <a3at.mail@gmail.com>
Sat, 26 Dec 2015 23:51:24 +0000 (02:51 +0300)
Before this patch event_reinit() only closes the signal socketpair fds and
recreates them if signals have been added, but this is wrong, since socketpair
fds created on backend init, and if we will not re-create them bad things in
child/parent signal handling will happens (and indeed this is what happens for
non-reinit backends like select).

Fixes: #307
event.c

diff --git a/event.c b/event.c
index def17665f972cd802ba4cab26bfab06cb0de9151..082d292f0e8203648ff5d92166aa491cec2993a6 100644 (file)
--- a/event.c
+++ b/event.c
@@ -969,13 +969,13 @@ event_reinit(struct event_base *base)
                event_del_nolock_(&base->sig.ev_signal, EVENT_DEL_AUTOBLOCK);
                event_debug_unassign(&base->sig.ev_signal);
                memset(&base->sig.ev_signal, 0, sizeof(base->sig.ev_signal));
-               if (base->sig.ev_signal_pair[0] != -1)
-                       EVUTIL_CLOSESOCKET(base->sig.ev_signal_pair[0]);
-               if (base->sig.ev_signal_pair[1] != -1)
-                       EVUTIL_CLOSESOCKET(base->sig.ev_signal_pair[1]);
                had_signal_added = 1;
                base->sig.ev_signal_added = 0;
        }
+       if (base->sig.ev_signal_pair[0] != -1)
+               EVUTIL_CLOSESOCKET(base->sig.ev_signal_pair[0]);
+       if (base->sig.ev_signal_pair[1] != -1)
+               EVUTIL_CLOSESOCKET(base->sig.ev_signal_pair[1]);
        if (base->th_notify_fn != NULL) {
                was_notifiable = 1;
                base->th_notify_fn = NULL;
@@ -1024,8 +1024,7 @@ event_reinit(struct event_base *base)
                if (evmap_reinit_(base) < 0)
                        res = -1;
        } else {
-               if (had_signal_added)
-                       res = evsig_init_(base);
+               res = evsig_init_(base);
        }
 
        /* If we were notifiable before, and nothing just exploded, become