From 985b3a30af10f1a7cf88d303f34ac1db8b686839 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Jos=C3=A9=20Arboleda?= Date: Mon, 10 Feb 2025 12:14:36 -0500 Subject: [PATCH] fs: handle UV_ENOTDIR in `fs.statSync` with `throwIfNoEntry` provided MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes: https://github.com/nodejs/node/issues/56993 Signed-off-by: Juan José Arboleda --- src/node_file.cc | 7 ++++++- test/parallel/test-fs-stat.js | 5 +++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/node_file.cc b/src/node_file.cc index 8e29bb398876258..559886d845dac0c 100644 --- a/src/node_file.cc +++ b/src/node_file.cc @@ -1088,6 +1088,10 @@ constexpr bool is_uv_error_except_no_entry(int result) { return result < 0 && result != UV_ENOENT; } +constexpr bool is_uv_error_except_no_entry_dir(int result) { + return result < 0 && !(result == UV_ENOENT || result == UV_ENOTDIR); +} + static void Stat(const FunctionCallbackInfo& args) { Realm* realm = Realm::GetCurrent(args); BindingData* binding_data = realm->GetBindingData(); @@ -1122,7 +1126,8 @@ static void Stat(const FunctionCallbackInfo& args) { int result; if (do_not_throw_if_no_entry) { result = SyncCallAndThrowIf( - is_uv_error_except_no_entry, env, &req_wrap_sync, uv_fs_stat, *path); + is_uv_error_except_no_entry_dir, + env, &req_wrap_sync, uv_fs_stat, *path); } else { result = SyncCallAndThrowOnError(env, &req_wrap_sync, uv_fs_stat, *path); } diff --git a/test/parallel/test-fs-stat.js b/test/parallel/test-fs-stat.js index b9d42b5b61bc837..cc7be77e53dadce 100644 --- a/test/parallel/test-fs-stat.js +++ b/test/parallel/test-fs-stat.js @@ -221,3 +221,8 @@ fs.lstat(__filename, undefined, common.mustCall()); }, ); } + +{ + // Test that the throwIfNoEntry option works and returns undefined + assert.ok(!(fs.statSync('./wont_exists', { throwIfNoEntry: false }))); +}