lib: reset the cwd cache before execution

PR-URL: https://github.com/nodejs/node/pull/49684
Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: LiviaMedeiros <livia@cirno.name>
Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
This commit is contained in:
Maël Nison 2023-09-21 18:56:33 +02:00 committed by GitHub
parent fa741580ab
commit b7d836e2c7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 69 additions and 0 deletions

View File

@ -2,6 +2,12 @@
const credentials = internalBinding('credentials');
const rawMethods = internalBinding('process_methods');
const {
namespace: {
addSerializeCallback,
isBuildingSnapshot,
},
} = require('internal/v8/startup_snapshot');
process.abort = rawMethods.abort;
process.umask = wrappedUmask;
@ -107,6 +113,12 @@ function wrapPosixCredentialSetters(credentials) {
// directory is changed by `chdir`, it'll be updated.
let cachedCwd = '';
if (isBuildingSnapshot()) {
addSerializeCallback(() => {
cachedCwd = '';
});
}
function wrappedChdir(directory) {
validateString(directory, 'directory');
rawMethods.chdir(directory);

10
test/fixtures/snapshot/cwd.js vendored Normal file
View File

@ -0,0 +1,10 @@
const {
setDeserializeMainFunction,
} = require('v8').startupSnapshot;
// To make sure the cwd is present in the cache
process.cwd();
setDeserializeMainFunction(() => {
console.log(process.cwd());
});

View File

@ -0,0 +1,47 @@
'use strict';
// This tests that process.cwd() is accurate when
// restoring state from a snapshot
require('../common');
const { spawnSyncAndExitWithoutError } = require('../common/child_process');
const tmpdir = require('../common/tmpdir');
const fixtures = require('../common/fixtures');
const fs = require('fs');
tmpdir.refresh();
const blobPath = tmpdir.resolve('snapshot.blob');
const file = fixtures.path('snapshot', 'cwd.js');
const subdir = tmpdir.resolve('foo');
fs.mkdirSync(subdir);
{
// Create the snapshot.
spawnSyncAndExitWithoutError(process.execPath, [
'--snapshot-blob',
blobPath,
'--build-snapshot',
file,
], {
cwd: tmpdir.path,
encoding: 'utf8'
}, {
status: 0,
});
}
{
spawnSyncAndExitWithoutError(process.execPath, [
'--snapshot-blob',
blobPath,
file,
], {
cwd: subdir,
encoding: 'utf8'
}, {
status: 0,
trim: true,
stdout: subdir,
});
}