From 13b4de565b8dd82d210ffde23761087b85964ffc Mon Sep 17 00:00:00 2001 From: Hussein Kadhim Date: Tue, 13 Oct 2026 14:35:08 +0300 Subject: [PATCH 1/2] fix(libkernel): return the error number from sigwait FreeBSD's sigwait hands the error number back as its return value and leaves errno alone; the guest export returned -1 and set errno. (cherry picked from commit b627f6c9443dd94a6392959f33e52d837ee4cae4) --- core/libs/prx/libkernel/System/src/Signals.cpp | 5 +++-- core/libs/tests/GuestSigtimedwait.cpp | 5 ++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/libs/prx/libkernel/System/src/Signals.cpp b/core/libs/prx/libkernel/System/src/Signals.cpp index 01226d305..72c8ab1a1 100644 --- a/core/libs/prx/libkernel/System/src/Signals.cpp +++ b/core/libs/prx/libkernel/System/src/Signals.cpp @@ -559,9 +559,10 @@ int APS5_VABI sigwaitinfo_nid_postfix(const GuestSignalSet* set, void* info) { } int APS5_VABI sigwait_nid_postfix(const GuestSignalSet* set, int* received) { - if (set == nullptr || received == nullptr || !SetHasSignal(*set)) { *__error_nid_postfix() = 22; return -1; } + if (set == nullptr || received == nullptr || !SetHasSignal(*set)) return 22; int guest = 0; - if (WaitForPendingInSet(*set, true, nullptr, &guest) != 0) { *__error_nid_postfix() = GuestEagain; return -1; } + const int result = WaitForPendingInSet(*set, true, nullptr, &guest); + if (result != 0) return result; *received = guest; return 0; } diff --git a/core/libs/tests/GuestSigtimedwait.cpp b/core/libs/tests/GuestSigtimedwait.cpp index 03a9a237b..347deaf32 100644 --- a/core/libs/tests/GuestSigtimedwait.cpp +++ b/core/libs/tests/GuestSigtimedwait.cpp @@ -96,9 +96,8 @@ int main() { *__error_nid_postfix() = 0; Require(sigwaitinfo_nid_postfix(&empty, &info) == -1 && *__error_nid_postfix() == 22); *__error_nid_postfix() = 0; - Require(sigwait_nid_postfix(&empty, &taken) == -1 && *__error_nid_postfix() == 22 && taken == -1); - *__error_nid_postfix() = 0; - Require(sigwait_nid_postfix(&interrupt, nullptr) == -1 && *__error_nid_postfix() == 22); + Require(sigwait_nid_postfix(&empty, &taken) == 22 && *__error_nid_postfix() == 0 && taken == -1); + Require(sigwait_nid_postfix(&interrupt, nullptr) == 22 && *__error_nid_postfix() == 0); RequireUntouched(info); *__error_nid_postfix() = 0; Require(sigtimedwait_nid_postfix(&interrupt, &info, &poll) == -1 && *__error_nid_postfix() == 35); From 85c090d49d07a66544401c4b5046266a93fe4b05 Mon Sep 17 00:00:00 2001 From: MarcZX100 Date: Tue, 13 Oct 2026 15:49:45 +0000 Subject: [PATCH 2/2] test(libkernel): verify sigwait preserves errno --- core/libs/tests/GuestSigtimedwait.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/core/libs/tests/GuestSigtimedwait.cpp b/core/libs/tests/GuestSigtimedwait.cpp index 347deaf32..52a65f57d 100644 --- a/core/libs/tests/GuestSigtimedwait.cpp +++ b/core/libs/tests/GuestSigtimedwait.cpp @@ -95,9 +95,12 @@ int main() { Require(sigwaitinfo_nid_postfix(nullptr, &info) == -1 && *__error_nid_postfix() == 22); *__error_nid_postfix() = 0; Require(sigwaitinfo_nid_postfix(&empty, &info) == -1 && *__error_nid_postfix() == 22); - *__error_nid_postfix() = 0; - Require(sigwait_nid_postfix(&empty, &taken) == 22 && *__error_nid_postfix() == 0 && taken == -1); - Require(sigwait_nid_postfix(&interrupt, nullptr) == 22 && *__error_nid_postfix() == 0); + *__error_nid_postfix() = 71; + Require(sigwait_nid_postfix(nullptr, &taken) == 22 && *__error_nid_postfix() == 71 && taken == -1); + *__error_nid_postfix() = 72; + Require(sigwait_nid_postfix(&empty, &taken) == 22 && *__error_nid_postfix() == 72 && taken == -1); + *__error_nid_postfix() = 73; + Require(sigwait_nid_postfix(&interrupt, nullptr) == 22 && *__error_nid_postfix() == 73); RequireUntouched(info); *__error_nid_postfix() = 0; Require(sigtimedwait_nid_postfix(&interrupt, &info, &poll) == -1 && *__error_nid_postfix() == 35);