From 46ad5f2a171080b3c1ee28c28b17bcfe8743b0a0 Mon Sep 17 00:00:00 2001 From: Jelle Raaijmakers Date: Wed, 24 Nov 2021 18:49:43 +0100 Subject: [PATCH] Kernel: Fix `futex` syscall return values We were returning `int`s from two functions that caused `ErrorOr` to not recognize the error codes as a special case. For example, `ETIMEDOUT` was returned as the positive number 66 resulting in all kinds of defective behavior. As a result, SDL2's timer subsystem was not working at all, since the `SDL_MUTEX_TIMEDOUT` value was never returned. --- Kernel/Syscalls/futex.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Kernel/Syscalls/futex.cpp b/Kernel/Syscalls/futex.cpp index b03963a882..0769d4953b 100644 --- a/Kernel/Syscalls/futex.cpp +++ b/Kernel/Syscalls/futex.cpp @@ -99,7 +99,7 @@ ErrorOr Process::sys$futex(Userspace u auto user_address = FlatPtr(params.userspace_address); auto user_address2 = FlatPtr(params.userspace_address2); - auto do_wait = [&](u32 bitset) -> int { + auto do_wait = [&](u32 bitset) -> ErrorOr { bool did_create; RefPtr futex_queue; do { @@ -136,7 +136,7 @@ ErrorOr Process::sys$futex(Userspace u return 0; }; - auto do_requeue = [&](Optional val3) -> int { + auto do_requeue = [&](Optional val3) -> ErrorOr { auto user_value = user_atomic_load_relaxed(params.userspace_address); if (!user_value.has_value()) return EFAULT; @@ -204,7 +204,7 @@ ErrorOr Process::sys$futex(Userspace u if (!oldval.has_value()) return EFAULT; atomic_thread_fence(AK::MemoryOrder::memory_order_acquire); - int result = do_wake(user_address, params.val, {}); + auto result = do_wake(user_address, params.val, {}); if (params.val2 > 0) { bool compare_result; switch (_FUTEX_CMP(params.val3)) {