summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYoshiya Hinosawa <stibium121@gmail.com>2024-10-23 11:28:04 +0900
committerGitHub <noreply@github.com>2024-10-23 11:28:04 +0900
commit285635daa67274f961d29c1e7795222709dc9618 (patch)
tree3d7b8a56ee9fb72f740234cc12beaab01e90ccb0
parent5e020ebc3507947cd9e999a4f7213d2d0d5416cf (diff)
fix(ext/node): map `ERROR_INVALID_NAME` to `ENOENT` on windows (#26475)
In libuv on windows, `ERROR_INVALID_NAME` is mapped to `ENOENT`, but it is mapped to `EINVAL` in our compat implementation, which causes the issue #24899. ref: https://github.com/libuv/libuv/blob/d4ab6fbba4669935a6bc23645372dfe4ac29ab39/src/win/error.c#L138 closes #24899 closes #26411 closes #23635 closes #21165 closes #19067
-rw-r--r--ext/node/ops/winerror.rs2
-rw-r--r--tests/unit_node/fs_test.ts11
2 files changed, 12 insertions, 1 deletions
diff --git a/ext/node/ops/winerror.rs b/ext/node/ops/winerror.rs
index e9dbadb6f..cb053774e 100644
--- a/ext/node/ops/winerror.rs
+++ b/ext/node/ops/winerror.rs
@@ -62,7 +62,7 @@ pub fn op_node_sys_to_uv_error(err: i32) -> String {
WSAEHOSTUNREACH => "EHOSTUNREACH",
ERROR_INSUFFICIENT_BUFFER => "EINVAL",
ERROR_INVALID_DATA => "EINVAL",
- ERROR_INVALID_NAME => "EINVAL",
+ ERROR_INVALID_NAME => "ENOENT",
ERROR_INVALID_PARAMETER => "EINVAL",
WSAEINVAL => "EINVAL",
WSAEPFNOSUPPORT => "EINVAL",
diff --git a/tests/unit_node/fs_test.ts b/tests/unit_node/fs_test.ts
index ac9c4a53e..ef8f829cd 100644
--- a/tests/unit_node/fs_test.ts
+++ b/tests/unit_node/fs_test.ts
@@ -233,3 +233,14 @@ Deno.test("[node/fs] copyFile COPYFILE_EXCL works", async () => {
copyFileSync(src, dest2, fsPromiseConstants.COPYFILE_EXCL)
);
});
+
+Deno.test("[node/fs] statSync throws ENOENT for invalid path containing colon in it", () => {
+ // deno-lint-ignore no-explicit-any
+ const err: any = assertThrows(() => {
+ // Note: Deno.stat throws ERROR_INVALID_NAME (os error 123) instead of
+ // ERROR_FILE_NOT_FOUND (os error 2) on windows. This case checks that
+ // ERROR_INVALID_NAME is mapped to ENOENT correctly on node compat layer.
+ statSync("jsr:@std/assert");
+ });
+ assertEquals(err.code, "ENOENT");
+});