fix(libkernel): accept a zero count in sceKernelSignalSema

sceKernelSignalSema threw invalid_argument for a count of 0. Marvel's
Wolverine (PPSA03671) signals with a count computed as min(a, b) - c,
which can be 0, and ignores the result, so the throw ended the title a
few minutes in. A zero count now adds no tokens and returns SCE_OK, as
in shadPS4 and Kyty. A null semaphore and a negative count still throw.

guest_kernel_errors signals 0 on a full and on an empty semaphore and
checks that the count is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 7191d34c4d79622ba71087f0da2b75eb81ad2c23)
This commit is contained in:
Lexroid 2026-10-10 14:41:37 +03:00 committed by MarcZX100
parent 57f96fd2b3
commit 45a561aea5
2 changed files with 4 additions and 1 deletions

View File

@ -36,7 +36,7 @@ int APS5_VABI sceKernelPollSema(KernelSema sem, int need) {
}
int APS5_VABI sceKernelSignalSema(KernelSema sem, int count) {
if (sem == nullptr || count <= 0) {
if (sem == nullptr || count < 0) {
APS5_INVALID_ARG_EX;
}

View File

@ -62,7 +62,10 @@ int main() {
Require(sceKernelCreateSema(&semaphore, "limit", 1, 1, 3, nullptr) == SCE_OK);
Require(sceKernelSignalSema(semaphore, 3) == SCE_KERNEL_ERROR_EINVAL);
Require(sceKernelSignalSema(semaphore, 2) == SCE_OK);
Require(sceKernelSignalSema(semaphore, 0) == SCE_OK);
Require(sceKernelPollSema(semaphore, 3) == SCE_OK);
Require(sceKernelSignalSema(semaphore, 0) == SCE_OK);
Require(sceKernelPollSema(semaphore, 1) == SCE_KERNEL_ERROR_EBUSY);
Require(sceKernelDeleteSema(semaphore) == SCE_OK);
KernelEqueue eq = 0;