chiark / gitweb /
event: fix crash on child-source state modifications
authorDavid Herrmann <dh.herrmann@gmail.com>
Wed, 19 Feb 2014 12:24:38 +0000 (13:24 +0100)
committerDavid Herrmann <dh.herrmann@gmail.com>
Wed, 19 Feb 2014 12:24:38 +0000 (13:24 +0100)
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.

src/libsystemd/sd-event/sd-event.c

index f33a9ecf9ac8dee1b8d6ba4f74c68429d120ad9e..cf2efa68a35c9c4bc21dc9a387177ad20e40720e 100644 (file)
@@ -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: