From e4c9a62173c8859599394529a756bf51398d8244 Mon Sep 17 00:00:00 2001 From: Allison Karlitskaya Date: Fri, 28 Jun 2019 10:15:33 +0200 Subject: [PATCH] gthread: fix minor errno problem in GCond The return value from `g_cond_wait_until()` is calculated, based on the value of `errno` after reacquiring the mutex. This is a problem because `errno` can be overwritten in the case the mutex is contended (in which case the slow-path code will re-enter the kernel). Perform the calculation before reacquiring the mutex. See merge request GNOME/glib!958 --- glib/gthread-posix.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/glib/gthread-posix.c b/glib/gthread-posix.c index 9c0b032e6..322a89c2e 100644 --- a/glib/gthread-posix.c +++ b/glib/gthread-posix.c @@ -1439,6 +1439,7 @@ g_cond_wait_until (GCond *cond, struct timespec span; guint sampled; int res; + gboolean success; if (end_time < 0) return FALSE; @@ -1458,9 +1459,10 @@ g_cond_wait_until (GCond *cond, sampled = cond->i[0]; g_mutex_unlock (mutex); res = syscall (__NR_futex, &cond->i[0], (gsize) FUTEX_WAIT_PRIVATE, (gsize) sampled, &span); + success = (res < 0 && errno == ETIMEDOUT) ? FALSE : TRUE; g_mutex_lock (mutex); - return (res < 0 && errno == ETIMEDOUT) ? FALSE : TRUE; + return success; } #endif