From: David Herrmann Date: Wed, 19 Feb 2014 12:24:38 +0000 (+0100) Subject: event: fix crash on child-source state modifications X-Git-Tag: v209~40 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=7a0d4a3d16855bac2ce2f2973122dae1ed069dff;ds=sidebyside event: fix crash on child-source state modifications Setting a child-source state to anything but SD_EVENT_OFF currently does nothing. The condition logic is flawed. Move the state update *below* the test for the previous state. Fixes a crash if you call: sd_event_source_set_enabled(source, SD_EVENT_ON); sd_event_source_unref(source); on a child-source in its own callback. --- diff --git a/src/libsystemd/sd-event/sd-event.c b/src/libsystemd/sd-event/sd-event.c index f33a9ecf9..cf2efa68a 100644 --- a/src/libsystemd/sd-event/sd-event.c +++ b/src/libsystemd/sd-event/sd-event.c @@ -1286,8 +1286,6 @@ _public_ int sd_event_source_set_enabled(sd_event_source *s, int m) { break; case SOURCE_CHILD: - s->enabled = m; - if (s->enabled == SD_EVENT_OFF) { s->event->n_enabled_child_sources++; @@ -1296,6 +1294,8 @@ _public_ int sd_event_source_set_enabled(sd_event_source *s, int m) { event_update_signal_fd(s->event); } } + + s->enabled = m; break; case SOURCE_EXIT: