summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKrzysztof Kotlenga <k.kotlenga@sims.pl>2015-09-24 00:34:51 +0200
committerSven Eden <yamakuzure@gmx.net>2017-03-29 10:45:10 +0200
commitf19dbc1cd834e521e98a2bd59074817a1098b47e (patch)
treea7f7cee08875eecc36f115e432f217635e7cacc3 /src
parent4a8b9253ee4cb0360eab07dc8da85fc38b2eb6bd (diff)
sd-event: fix prepare priority queue comparison function
Otherwise a disabled event source can get swapped with an enabled one and cause a severe sd-event malfunction. http://lists.freedesktop.org/archives/elogind-devel/2015-September/034356.html
Diffstat (limited to 'src')
-rw-r--r--src/libelogind/sd-event/sd-event.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/src/libelogind/sd-event/sd-event.c b/src/libelogind/sd-event/sd-event.c
index 062f19b56..bb5905fea 100644
--- a/src/libelogind/sd-event/sd-event.c
+++ b/src/libelogind/sd-event/sd-event.c
@@ -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;