fb7efbf
From d22d9301ece9e6cffc5db8266afb3b99df32306c Mon Sep 17 00:00:00 2001
fb7efbf
From: Krzysztof Kotlenga <k.kotlenga@sims.pl>
fb7efbf
Date: Thu, 24 Sep 2015 00:34:51 +0200
fb7efbf
Subject: [PATCH 45/47] sd-event: fix prepare priority queue comparison
fb7efbf
 function
fb7efbf
fb7efbf
Otherwise a disabled event source can get swapped with an enabled one
fb7efbf
and cause a severe sd-event malfunction.
fb7efbf
fb7efbf
http://lists.freedesktop.org/archives/systemd-devel/2015-September/034356.html
fb7efbf
---
fb7efbf
 src/libsystemd/sd-event/sd-event.c | 12 ++++++------
fb7efbf
 1 file changed, 6 insertions(+), 6 deletions(-)
fb7efbf
fb7efbf
diff --git a/src/libsystemd/sd-event/sd-event.c b/src/libsystemd/sd-event/sd-event.c
fb7efbf
index 3459f50..6127888 100644
fb7efbf
--- a/src/libsystemd/sd-event/sd-event.c
fb7efbf
+++ b/src/libsystemd/sd-event/sd-event.c
fb7efbf
@@ -231,6 +231,12 @@ static int prepare_prioq_compare(const void *a, const void *b) {
fb7efbf
         assert(x->prepare);
fb7efbf
         assert(y->prepare);
fb7efbf
 
fb7efbf
+        /* Enabled ones first */
fb7efbf
+        if (x->enabled != SD_EVENT_OFF && y->enabled == SD_EVENT_OFF)
fb7efbf
+                return -1;
fb7efbf
+        if (x->enabled == SD_EVENT_OFF && y->enabled != SD_EVENT_OFF)
fb7efbf
+                return 1;
fb7efbf
+
fb7efbf
         /* Move most recently prepared ones last, so that we can stop
fb7efbf
          * preparing as soon as we hit one that has already been
fb7efbf
          * prepared in the current iteration */
fb7efbf
@@ -239,12 +245,6 @@ static int prepare_prioq_compare(const void *a, const void *b) {
fb7efbf
         if (x->prepare_iteration > y->prepare_iteration)
fb7efbf
                 return 1;
fb7efbf
 
fb7efbf
-        /* Enabled ones first */
fb7efbf
-        if (x->enabled != SD_EVENT_OFF && y->enabled == SD_EVENT_OFF)
fb7efbf
-                return -1;
fb7efbf
-        if (x->enabled == SD_EVENT_OFF && y->enabled != SD_EVENT_OFF)
fb7efbf
-                return 1;
fb7efbf
-
fb7efbf
         /* Lower priority values first */
fb7efbf
         if (x->priority < y->priority)
fb7efbf
                 return -1;
fb7efbf
-- 
fb7efbf
2.5.0
fb7efbf