Skip to content

Commit

Permalink
fix: disable v8-compile-cache when using npm@>=9.7.0 (#276)
Browse files Browse the repository at this point in the history
Node.js segfaults when using `npm@>=9.7.0` and `v8-compile-cache`
```console
$ docker run -it node:20.3.0-slim corepack [email protected] --version
[SIGSEGV]
```
  • Loading branch information
merceyz authored Jun 13, 2023
1 parent 17d1f3d commit 2f3678c
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 4 deletions.
10 changes: 7 additions & 3 deletions sources/corepackUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ export async function installVersion(installTarget: string, locator: Locator, {s
/**
* Loads the binary, taking control of the current process.
*/
export async function runVersion(installSpec: { location: string, spec: PackageManagerSpec }, binName: string, args: Array<string>): Promise<void> {
export async function runVersion(locator: Locator, installSpec: { location: string, spec: PackageManagerSpec }, binName: string, args: Array<string>): Promise<void> {
let binPath: string | null = null;
if (Array.isArray(installSpec.spec.bin)) {
if (installSpec.spec.bin.some(bin => bin === binName)) {
Expand All @@ -191,8 +191,12 @@ export async function runVersion(installSpec: { location: string, spec: PackageM
if (!binPath)
throw new Error(`Assertion failed: Unable to locate path for bin '${binName}'`);

// @ts-expect-error - No types
await import(`v8-compile-cache`);
// Node.js segfaults when using npm@>=9.7.0 and v8-compile-cache
// $ docker run -it node:20.3.0-slim corepack [email protected] --version
// [SIGSEGV]
if (locator.name !== `npm` || semver.lt(locator.reference, `9.7.0`))
// @ts-expect-error - No types
await import(`v8-compile-cache`);

// We load the binary into the current process,
// while making it think it was spawned.
Expand Down
2 changes: 1 addition & 1 deletion sources/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ async function executePackageManagerRequest({packageManager, binaryName, binaryV

const installSpec = await context.engine.ensurePackageManager(resolved);

return await corepackUtils.runVersion(installSpec, binaryName, args);
return await corepackUtils.runVersion(resolved, installSpec, binaryName, args);
}

export async function runMain(argv: Array<string>) {
Expand Down

0 comments on commit 2f3678c

Please sign in to comment.