diff --git a/deps/uv/src/win/fs.c b/deps/uv/src/win/fs.c index fc209c54f470ed..4fc13b04bdae5b 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; diff --git a/test/parallel/test-fs-operations-with-surrogate-pairs.js b/test/parallel/test-fs-operations-with-surrogate-pairs.js new file mode 100644 index 00000000000000..d46623e8c208ae --- /dev/null +++ b/test/parallel/test-fs-operations-with-surrogate-pairs.js @@ -0,0 +1,31 @@ +'use strict'; + +require('../common'); +const fs = require('node:fs'); +const path = require('node:path'); +const assert = require('node:assert'); +const { describe, it } = require('node:test'); +const tmpdir = require('../common/tmpdir'); + +tmpdir.refresh(); + +describe('File operations with filenames containing surrogate pairs', () => { + it('should write, read, and delete a file with surrogate pairs in the filename', () => { + // Create a temporary directory + const tempdir = fs.mkdtempSync(tmpdir.resolve('emoji-fruit-🍇 🍈 🍉 🍊 🍋')); + assert.strictEqual(fs.existsSync(tempdir), true); + + const filename = '🚀🔥🛸.txt'; + const content = 'Test content'; + + // Write content to a file + fs.writeFileSync(path.join(tempdir, filename), content); + + // Read content from the file + const readContent = fs.readFileSync(path.join(tempdir, filename), 'utf8'); + + // Check if the content matches + assert.strictEqual(readContent, content); + + }); +});