From d53f1ed5a7041810a9e5afaa19f866f01cae8230 Mon Sep 17 00:00:00 2001 From: Sam Clegg Date: Tue, 3 Feb 2026 14:24:40 -0800 Subject: [PATCH 1/2] Fix fd_sync under pthreads This function is marked as `__async: 'auto'` which means it should return a promise when run in proxied mode on the main thread. However it wasn't always returning a promise. Adding the `async` keyword is the simplest way to ensure it always returns a promise. Also, update the `wrapSyscallFunction` function to preserve the async keyword. Replaces: #26209 --- src/lib/libcore.js | 2 +- src/lib/libwasi.js | 23 ++++++++++++++--------- test/fs/test_memfs_fsync.c | 5 +++-- test/test_other.py | 12 +++++++++++- 4 files changed, 29 insertions(+), 13 deletions(-) diff --git a/src/lib/libcore.js b/src/lib/libcore.js index 1355a7b075863..1fb5e90f2597b 100644 --- a/src/lib/libcore.js +++ b/src/lib/libcore.js @@ -2605,7 +2605,7 @@ function wrapSyscallFunction(x, library, isWasi) { post = handler + post; if (pre || post) { - t = modifyJSFunction(t, (args, body) => `function (${args}) {\n${pre}${body}${post}}\n`); + t = modifyJSFunction(t, (args, body, async_) => `${async_}function (${args}) {\n${pre}${body}${post}}\n`); } library[x] = eval('(' + t + ')'); diff --git a/src/lib/libwasi.js b/src/lib/libwasi.js index 55a32db216022..bd85bac000886 100644 --- a/src/lib/libwasi.js +++ b/src/lib/libwasi.js @@ -540,27 +540,32 @@ var WasiLibrary = { return 0; }, +#if SYSCALLS_REQUIRE_FILESYSTEM fd_sync__async: 'auto', fd_sync: (fd) => { -#if SYSCALLS_REQUIRE_FILESYSTEM var stream = SYSCALLS.getStreamFromFD(fd); var rtn = stream.stream_ops?.fsync?.(stream); -#if ASYNCIFY - var mount = stream.node.mount; - if (mount.type.syncfs) { - return new Promise((resolve) => { +#if ASYNCIFY || PTHREADS + return new Promise((resolve) => { + var mount = stream.node.mount; + if (mount && mount.type.syncfs) { mount.type.syncfs(mount, false, (err) => resolve(err ? {{{ cDefs.EIO }}} : 0)); - }); - } -#endif // ASYNCIFY + } else { + resolve(rtn); + } + }); +#else return rtn; +#endif // ASYNCIFY || PTHREADS + }, #else // SYSCALLS_REQUIRE_FILESYSTEM + fd_sync: (fd) => { #if ASSERTIONS abort('fd_sync called without SYSCALLS_REQUIRE_FILESYSTEM'); #endif return {{{ cDefs.ENOSYS }}}; -#endif // SYSCALLS_REQUIRE_FILESYSTEM }, +#endif // SYSCALLS_REQUIRE_FILESYSTEM // random.h diff --git a/test/fs/test_memfs_fsync.c b/test/fs/test_memfs_fsync.c index 67d9aafe11947..0933395253ba4 100644 --- a/test/fs/test_memfs_fsync.c +++ b/test/fs/test_memfs_fsync.c @@ -23,10 +23,10 @@ int main() { struct stat st; // a file whose contents are just 'az' - rtn = stat("/wakaka.txt", &st); + rtn = stat("wakaka.txt", &st); assert(rtn == -1 && errno == ENOENT); - fd = open("/wakaka.txt", O_RDWR | O_CREAT, 0666); + fd = open("wakaka.txt", O_RDWR | O_CREAT, 0666); assert(fd >= 0); rtn = write(fd, "az", 2); @@ -38,5 +38,6 @@ int main() { rtn = close(fd); assert(rtn == 0); + printf("success\n"); return 0; } diff --git a/test/test_other.py b/test/test_other.py index 373fb7110c68d..1e50725b06981 100644 --- a/test/test_other.py +++ b/test/test_other.py @@ -58,6 +58,7 @@ also_with_asan, also_with_minimal_runtime, also_with_modularize, + also_with_nodefs_both, also_with_noderawfs, also_with_standalone_wasm, also_with_wasm2js, @@ -5525,7 +5526,16 @@ def test_dashM_respect_dashO(self): @with_all_fs @crossplatform def test_fs_bad_lookup(self): - self.do_runf(path_from_root('test/fs/test_fs_bad_lookup.c'), expected_output='ok') + self.do_runf('fs/test_fs_bad_lookup.c', 'ok') + + @also_with_nodefs_both + @crossplatform + @parameterized({ + '': ([],), + 'pthreads': (['-pthread', '-sPROXY_TO_PTHREAD', '-sEXIT_RUNTIME'],), + }) + def test_fsync(self, args): + self.do_runf('fs/test_memfs_fsync.c', 'success', cflags=args) @with_all_fs @crossplatform From 0899a4239af0832985b3609434b4b9234c1f780c Mon Sep 17 00:00:00 2001 From: Sam Clegg Date: Wed, 4 Feb 2026 13:33:06 -0800 Subject: [PATCH 2/2] Update src/lib/libwasi.js Co-authored-by: Alon Zakai --- src/lib/libwasi.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/libwasi.js b/src/lib/libwasi.js index bd85bac000886..bb67581f269a6 100644 --- a/src/lib/libwasi.js +++ b/src/lib/libwasi.js @@ -548,7 +548,7 @@ var WasiLibrary = { #if ASYNCIFY || PTHREADS return new Promise((resolve) => { var mount = stream.node.mount; - if (mount && mount.type.syncfs) { + if (mount?.type.syncfs) { mount.type.syncfs(mount, false, (err) => resolve(err ? {{{ cDefs.EIO }}} : 0)); } else { resolve(rtn);