From: Hood Chatham Date: Tue, 22 Jul 2025 13:05:26 +0000 (+0200) Subject: gh-124621: Emscripten: Fix __syscall_ioctl patch (GH-136993) X-Git-Tag: v3.15.0a1~882 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=12d2f373b9f70ce43a985ada2832ca31ca66fc20;p=thirdparty%2FPython%2Fcpython.git gh-124621: Emscripten: Fix __syscall_ioctl patch (GH-136993) If there is an error, we have to return `-errno` not positive errno. Included in backport of GH-136931: #136988 --- diff --git a/Python/emscripten_syscalls.c b/Python/emscripten_syscalls.c index 404d98d492a6..98ee44276e53 100644 --- a/Python/emscripten_syscalls.c +++ b/Python/emscripten_syscalls.c @@ -1,6 +1,10 @@ #include "emscripten.h" #include "stdio.h" +// All system calls: return nonnegative number on success, return -errno on +// failure. Negative results get stored back into errno here: +// https://github.com/emscripten-core/emscripten/blob/main/system/lib/libc/musl/src/internal/syscall_ret.c#L7 + // If we're running in node, report the UID of the user in the native system as // the UID of the user. Since the nodefs will report the uid correctly, if we // don't make getuid report it correctly too we'll see some permission errors. @@ -302,7 +306,7 @@ int __syscall_ioctl(int fd, int request, void* varargs) { int flags = fcntl(fd, F_GETFL, 0); int nonblock = **((int**)varargs); if (flags < 0) { - return errno; + return -errno; } if (nonblock) { flags |= O_NONBLOCK; @@ -311,7 +315,7 @@ int __syscall_ioctl(int fd, int request, void* varargs) { } int res = fcntl(fd, F_SETFL, flags); if (res < 0) { - return errno; + return -errno; } return res; }