From 7f10377416bb0161f1188741a6c6ae3765ea6a5c Mon Sep 17 00:00:00 2001 From: Sam Clegg Date: Mon, 10 Mar 2025 17:24:42 -0700 Subject: [PATCH] Fix for core_2gb.test_fs_js_api_wasmfs. NFC This tests is failing on the emscripten-releases waterfall. In 2Gb+ mode its no longer possible to fix the returning of pointers with the returning of `-errno` since negative number are valid pointers in this mode. --- .circleci/config.yml | 1 + src/lib/libwasmfs.js | 8 ++++++-- system/lib/wasmfs/js_api.cpp | 5 +++-- tools/emscripten.py | 2 +- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 43f3d9abf9678..12f19082965de 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -662,6 +662,7 @@ jobs: wasm64 core_2gb.test_*em_asm* core_2gb.test_*embind* + core_2gb.test_fs_js_api_wasmfs wasm64l.test_hello_world wasm64l.test_bigswitch wasm64l.test_module_wasm_memory diff --git a/src/lib/libwasmfs.js b/src/lib/libwasmfs.js index 4c62b1dffebbb..1dd384518b5c0 100644 --- a/src/lib/libwasmfs.js +++ b/src/lib/libwasmfs.js @@ -242,8 +242,12 @@ addToLibrary({ __wasmfs_symlink(stringToUTF8OnStack(target), stringToUTF8OnStack(linkpath)) )), readlink(path) { - var readBuffer = FS.handleError(withStackSave(() => __wasmfs_readlink(stringToUTF8OnStack(path)))); - return UTF8ToString(readBuffer); + return withStackSave(() => { + var bufPtr = stackAlloc({{{ POINTER_SIZE }}}); + FS.handleError(__wasmfs_readlink(stringToUTF8OnStack(path), bufPtr)); + var readBuffer = {{{ makeGetValue('bufPtr', '0', '*') }}}; + return UTF8ToString(readBuffer); + }); }, statBufToObject(statBuf) { // i53/u53 are enough for times and ino in practice. diff --git a/system/lib/wasmfs/js_api.cpp b/system/lib/wasmfs/js_api.cpp index e4b4f502b001b..dba5fdb6dd93d 100644 --- a/system/lib/wasmfs/js_api.cpp +++ b/system/lib/wasmfs/js_api.cpp @@ -140,7 +140,7 @@ int _wasmfs_symlink(const char* old_path, const char* new_path) { return __syscall_symlinkat((intptr_t)old_path, AT_FDCWD, (intptr_t)new_path); } -intptr_t _wasmfs_readlink(const char* path) { +int _wasmfs_readlink(const char* path, char** out_ptr) { static thread_local char* readBuf = (char*)malloc(PATH_MAX); int bytes = __syscall_readlinkat(AT_FDCWD, (intptr_t)path, (intptr_t)readBuf, PATH_MAX); @@ -148,7 +148,8 @@ intptr_t _wasmfs_readlink(const char* path) { return bytes; } readBuf[bytes] = '\0'; - return (intptr_t)readBuf; + *out_ptr = readBuf; + return 0; } int _wasmfs_write(int fd, void* buf, size_t count) { diff --git a/tools/emscripten.py b/tools/emscripten.py index bb733c58a5689..98bd9c7abbf15 100644 --- a/tools/emscripten.py +++ b/tools/emscripten.py @@ -1078,7 +1078,7 @@ def create_pointer_conversion_wrappers(metadata): '_emscripten_proxy_dlsync_async': '_pp', '_emscripten_wasm_worker_initialize': '_p_', '_wasmfs_rename': '_pp', - '_wasmfs_readlink': 'pp', + '_wasmfs_readlink': '_pp', '_wasmfs_truncate': '_p_', '_wasmfs_mmap': 'pp____', '_wasmfs_munmap': '_pp',