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.
This commit is contained in:
Peter Kjellerstedt 2023-04-25 20:02:31 +02:00 committed by Peter Kjellerstedt
parent c176fcf2eb
commit edd1e47f10

View File

@ -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)