From eea3a6084930f965d9e4e583d80f55bb064fd01c Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Sat, 19 Jul 2025 18:43:39 +0200 Subject: [PATCH] gh-124621: Emscripten: Fix regression in use-after-close error handling Introduced in GH-136822. If the fd is already closed, `SYSCALLS.getStreamFromFD()` throws an error. We need to catch it and discard it. The `__wasi_fd_read_orig()` fallback will use it to set errno. --- Python/emscripten_syscalls.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Python/emscripten_syscalls.c b/Python/emscripten_syscalls.c index bd5cc07071f20e..886262acbc6810 100644 --- a/Python/emscripten_syscalls.c +++ b/Python/emscripten_syscalls.c @@ -148,10 +148,17 @@ EM_JS_MACROS(__externref_t, __maybe_fd_read_async, ( size_t iovcnt, __wasi_size_t *nread ), { - var stream = SYSCALLS.getStreamFromFD(fd); if (!WebAssembly.promising) { return null; } + var stream; + try { + stream = SYSCALLS.getStreamFromFD(fd); + } catch (e) { + // If the fd was already closed or never existed, getStreamFromFD() + // raises. We'll let fd_read_orig() handle setting errno. + return null; + } if (!stream.stream_ops.readAsync) { // Not an async device. Fall back to __wasi_fd_read_orig(). return null;