]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-event: fix prepare priority queue comparison function 1366/head
authorKrzysztof Kotlenga <k.kotlenga@sims.pl>
Wed, 23 Sep 2015 22:34:51 +0000 (00:34 +0200)
committerKrzysztof Kotlenga <k.kotlenga@sims.pl>
Wed, 23 Sep 2015 22:48:30 +0000 (00:48 +0200)
Otherwise a disabled event source can get swapped with an enabled one
and cause a severe sd-event malfunction.

http://lists.freedesktop.org/archives/systemd-devel/2015-September/034356.html

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

index fd39a562257f73d95d7f740d0c1f7213c9f08895..48a521927576ee16302276bd257de30b45d6d57a 100644 (file)
@@ -257,6 +257,12 @@ static int prepare_prioq_compare(const void *a, const void *b) {
         assert(x->prepare);
         assert(y->prepare);
 
+        /* Enabled ones first */
+        if (x->enabled != SD_EVENT_OFF && y->enabled == SD_EVENT_OFF)
+                return -1;
+        if (x->enabled == SD_EVENT_OFF && y->enabled != SD_EVENT_OFF)
+                return 1;
+
         /* Move most recently prepared ones last, so that we can stop
          * preparing as soon as we hit one that has already been
          * prepared in the current iteration */
@@ -265,12 +271,6 @@ static int prepare_prioq_compare(const void *a, const void *b) {
         if (x->prepare_iteration > y->prepare_iteration)
                 return 1;
 
-        /* Enabled ones first */
-        if (x->enabled != SD_EVENT_OFF && y->enabled == SD_EVENT_OFF)
-                return -1;
-        if (x->enabled == SD_EVENT_OFF && y->enabled != SD_EVENT_OFF)
-                return 1;
-
         /* Lower priority values first */
         if (x->priority < y->priority)
                 return -1;