From a46685fd593e615ef8d055bb68c5ba45d14da8b7 Mon Sep 17 00:00:00 2001 From: "trop[bot]" <37223003+trop[bot]@users.noreply.github.com> Date: Mon, 25 Mar 2024 10:02:13 +0100 Subject: [PATCH] fix: WTF-8 decoding issue in `node:fs` (#41681) fix: WTF-8 decoding issue in node:fs Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com> Co-authored-by: Shelley Vohr --- patches/node/.patches | 1 + .../node/fs_fix_wtf-8_decoding_issue.patch | 30 +++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 patches/node/fs_fix_wtf-8_decoding_issue.patch diff --git a/patches/node/.patches b/patches/node/.patches index 6222657477..09ea299e4b 100644 --- a/patches/node/.patches +++ b/patches/node/.patches @@ -47,3 +47,4 @@ build_ensure_v8_pointer_compression_sandbox_is_enabled_on_64bit.patch fix_revert_src_lb_reducing_c_calls_of_esm_legacy_main_resolve.patch src_preload_function_for_environment.patch deprecate_vector_v8_local_in_v8.patch +fs_fix_wtf-8_decoding_issue.patch diff --git a/patches/node/fs_fix_wtf-8_decoding_issue.patch b/patches/node/fs_fix_wtf-8_decoding_issue.patch new file mode 100644 index 0000000000..6f433693d0 --- /dev/null +++ b/patches/node/fs_fix_wtf-8_decoding_issue.patch @@ -0,0 +1,30 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Richard Lau +Date: Fri, 1 Mar 2024 19:15:40 +0000 +Subject: fs: fix WTF-8 decoding issue + +Cherry-pick of libuv/libuv@d09441c + +Refs: https://github.com/libuv/libuv/pull/2970 +Fixes: https://github.com/nodejs/node/issues/48673 + +We forgot to mask off the high bits from the first byte, so we ended up +always failing the subsequent range check. + +diff --git a/deps/uv/src/win/fs.c b/deps/uv/src/win/fs.c +index fc209c54f470edaa031009979061cff071cbf66d..4fc13b04bdae5bd9e2627027a10c534c2d9675dc 100644 +--- a/deps/uv/src/win/fs.c ++++ b/deps/uv/src/win/fs.c +@@ -176,9 +176,11 @@ static int32_t fs__decode_wtf8_char(const char** input) { + if ((b4 & 0xC0) != 0x80) + return -1; /* invalid: not a continuation byte */ + code_point = (code_point << 6) | (b4 & 0x3F); +- if (b1 <= 0xF4) ++ if (b1 <= 0xF4) { ++ code_point &= 0x1FFFFF; + if (code_point <= 0x10FFFF) + return code_point; /* four-byte character */ ++ } + + /* code point too large */ + return -1;