mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-11-10 03:16:17 +01:00
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:
parent
c176fcf2eb
commit
edd1e47f10
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user