From 02a6013bc2d9e24b309b34dc19fe1ba3b6c65f91 Mon Sep 17 00:00:00 2001 From: Yuri Iozzelli Date: Mon, 28 Sep 2026 11:46:14 +0200 Subject: [PATCH] fix(pnp): esm - prevent the readFileUtf8 patch from recursing The ESM loader replaces readFileUtf8 (readFileSync on older Node) on the internal fs binding with a function that reads through fs.readFileSync. For files outside of zip archives fs.readFileSync calls that same binding method, so each read recursed until the stack overflowed; the RangeError was swallowed and the innermost call fell back to the original binding. Calls nested within the patched function now go straight to the original binding. Co-Authored-By: Claude Opus 5.5 (1M context) --- .pnp.loader.mjs | 24 +++++++++------ .yarn/versions/9a6615ad.yml | 27 +++++++++++++++++ .../sources/esm-loader/built-loader.js | 2 +- .../yarnpkg-pnp/sources/esm-loader/fspatch.ts | 30 +++++++++++++------ 4 files changed, 64 insertions(+), 19 deletions(-) create mode 100644 .yarn/versions/9a6615ad.yml diff --git a/.pnp.loader.mjs b/.pnp.loader.mjs index 15cab03575b6..f48fb66192b8 100644 --- a/.pnp.loader.mjs +++ b/.pnp.loader.mjs @@ -2072,16 +2072,22 @@ if (!HAS_LAZY_LOADED_TRANSLATORS) { const binding = process.binding(`fs`); const originalReadFile = binding.readFileUtf8 || binding.readFileSync; if (originalReadFile) { + let isInPatchedReadFile = false; binding[originalReadFile.name] = function(...args) { - try { - return fs.readFileSync(args[0], { - encoding: `utf8`, - // @ts-expect-error - The docs says it needs to be a string but - // links to https://nodejs.org/dist/latest-v20.x/docs/api/fs.html#file-system-flags - // which says it can be a number which matches the implementation. - flag: args[1] - }); - } catch { + if (!isInPatchedReadFile) { + isInPatchedReadFile = true; + try { + return fs.readFileSync(args[0], { + encoding: `utf8`, + // @ts-expect-error - The docs says it needs to be a string but + // links to https://nodejs.org/dist/latest-v20.x/docs/api/fs.html#file-system-flags + // which says it can be a number which matches the implementation. + flag: args[1] + }); + } catch { + } finally { + isInPatchedReadFile = false; + } } return originalReadFile.apply(this, args); }; diff --git a/.yarn/versions/9a6615ad.yml b/.yarn/versions/9a6615ad.yml new file mode 100644 index 000000000000..22e76f05f959 --- /dev/null +++ b/.yarn/versions/9a6615ad.yml @@ -0,0 +1,27 @@ +releases: + "@yarnpkg/cli": patch + "@yarnpkg/plugin-pnp": patch + "@yarnpkg/pnp": patch + +declined: + - "@yarnpkg/plugin-compat" + - "@yarnpkg/plugin-constraints" + - "@yarnpkg/plugin-dlx" + - "@yarnpkg/plugin-essentials" + - "@yarnpkg/plugin-init" + - "@yarnpkg/plugin-interactive-tools" + - "@yarnpkg/plugin-nm" + - "@yarnpkg/plugin-npm-cli" + - "@yarnpkg/plugin-pack" + - "@yarnpkg/plugin-patch" + - "@yarnpkg/plugin-pnpm" + - "@yarnpkg/plugin-stage" + - "@yarnpkg/plugin-typescript" + - "@yarnpkg/plugin-version" + - "@yarnpkg/plugin-workspace-tools" + - "@yarnpkg/builder" + - "@yarnpkg/core" + - "@yarnpkg/doctor" + - "@yarnpkg/nm" + - "@yarnpkg/pnpify" + - "@yarnpkg/sdks" diff --git a/packages/yarnpkg-pnp/sources/esm-loader/built-loader.js b/packages/yarnpkg-pnp/sources/esm-loader/built-loader.js index 44589718fc1f..49f629a329fa 100644 --- a/packages/yarnpkg-pnp/sources/esm-loader/built-loader.js +++ b/packages/yarnpkg-pnp/sources/esm-loader/built-loader.js @@ -2,7 +2,7 @@ let hook; module.exports = () => { if (typeof hook === `undefined`) - hook = require('zlib').brotliDecompressSync(Buffer.from('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', 'base64')).toString(); + hook = require('zlib').brotliDecompressSync(Buffer.from('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', 'base64')).toString(); return hook; }; diff --git a/packages/yarnpkg-pnp/sources/esm-loader/fspatch.ts b/packages/yarnpkg-pnp/sources/esm-loader/fspatch.ts index c2d14c0ec6d2..d300f5cc4196 100644 --- a/packages/yarnpkg-pnp/sources/esm-loader/fspatch.ts +++ b/packages/yarnpkg-pnp/sources/esm-loader/fspatch.ts @@ -19,17 +19,29 @@ if (!HAS_LAZY_LOADED_TRANSLATORS) { const originalReadFile = binding.readFileUtf8 || binding.readFileSync; if (originalReadFile) { + // `fs.readFileSync` calls back into this binding for files that aren't + // in a zip archive, which would recurse until the stack overflows (and + // the `RangeError` would be swallowed by the `catch` below). Nested calls + // go straight to the original binding instead. + let isInPatchedReadFile = false; + // @ts-expect-error - No index signature binding[originalReadFile.name] = function (...args: Parameters) { - try { - return fs.readFileSync(args[0], { - encoding: `utf8`, - // @ts-expect-error - The docs says it needs to be a string but - // links to https://nodejs.org/dist/latest-v20.x/docs/api/fs.html#file-system-flags - // which says it can be a number which matches the implementation. - flag: args[1], - }); - } catch { } + if (!isInPatchedReadFile) { + isInPatchedReadFile = true; + try { + return fs.readFileSync(args[0], { + encoding: `utf8`, + // @ts-expect-error - The docs says it needs to be a string but + // links to https://nodejs.org/dist/latest-v20.x/docs/api/fs.html#file-system-flags + // which says it can be a number which matches the implementation. + flag: args[1], + }); + } catch { + } finally { + isInPatchedReadFile = false; + } + } return originalReadFile.apply(this, args); };