From edd1e47f107410d9e4edb691335410026ae5a534 Mon Sep 17 00:00:00 2001 From: Peter Kjellerstedt Date: Tue, 25 Apr 2023 20:02:31 +0200 Subject: Avoid having g_futex_simple() inadvertently modify errno If both __NR_futex and __NR_futex_time64 are defined, g_futex_simple() will first call futex_time64(). If that fails with ENOSYS, then futex_time() is called instead. However, errno was not saved and restored in this case, which would result in g_futex_simple() returning with errno set to ENOSYS, even if futex_time() succeeded. --- glib/gthreadprivate.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/glib/gthreadprivate.h b/glib/gthreadprivate.h index 9c847e039..74d37ba32 100644 --- a/glib/gthreadprivate.h +++ b/glib/gthreadprivate.h @@ -65,9 +65,13 @@ struct _GRealThread #define g_futex_simple(uaddr, futex_op, ...) \ G_STMT_START \ { \ + int saved_errno = errno; \ int res = syscall (__NR_futex_time64, uaddr, (gsize) futex_op, __VA_ARGS__); \ if (res < 0 && errno == ENOSYS) \ - syscall (__NR_futex, uaddr, (gsize) futex_op, __VA_ARGS__); \ + { \ + errno = saved_errno; \ + syscall (__NR_futex, uaddr, (gsize) futex_op, __VA_ARGS__); \ + } \ } \ G_STMT_END #elif defined(__NR_futex_time64) -- cgit v1.2.1