The WASI link test attempts to create a link in the temporary directory to a file in the fixtures directory and can fail if those directories are on different devices. Update the test so that both the source and target of the link reside on the same device. PR-URL: https://github.com/nodejs/node/pull/39485 Fixes: https://github.com/nodejs/node/issues/39484 Reviewed-By: Tobias Nießen <tniessen@tnie.de> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
85 lines
3 KiB
JavaScript
85 lines
3 KiB
JavaScript
'use strict';
|
|
const common = require('../common');
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
|
|
if (process.argv[2] === 'wasi-child') {
|
|
common.expectWarning('ExperimentalWarning',
|
|
'WASI is an experimental feature. This feature could ' +
|
|
'change at any time');
|
|
|
|
const { WASI } = require('wasi');
|
|
const wasmDir = path.join(__dirname, 'wasm');
|
|
const wasi = new WASI({
|
|
args: [],
|
|
env: process.env,
|
|
preopens: {
|
|
'/sandbox': process.argv[4],
|
|
'/tmp': process.argv[5]
|
|
}
|
|
});
|
|
const importObject = { wasi_snapshot_preview1: wasi.wasiImport };
|
|
const modulePath = path.join(wasmDir, `${process.argv[3]}.wasm`);
|
|
const buffer = fs.readFileSync(modulePath);
|
|
|
|
(async () => {
|
|
const { instance } = await WebAssembly.instantiate(buffer, importObject);
|
|
|
|
wasi.start(instance);
|
|
})().then(common.mustCall());
|
|
} else {
|
|
if (!common.canCreateSymLink()) {
|
|
common.skip('insufficient privileges');
|
|
}
|
|
|
|
const assert = require('assert');
|
|
const cp = require('child_process');
|
|
const tmpdir = require('../common/tmpdir');
|
|
|
|
// Setup the sandbox environment.
|
|
tmpdir.refresh();
|
|
const sandbox = path.join(tmpdir.path, 'sandbox');
|
|
const sandboxedFile = path.join(sandbox, 'input.txt');
|
|
const externalFile = path.join(tmpdir.path, 'outside.txt');
|
|
const sandboxedDir = path.join(sandbox, 'subdir');
|
|
const sandboxedSymlink = path.join(sandboxedDir, 'input_link.txt');
|
|
const escapingSymlink = path.join(sandboxedDir, 'outside.txt');
|
|
const loopSymlink1 = path.join(sandboxedDir, 'loop1');
|
|
const loopSymlink2 = path.join(sandboxedDir, 'loop2');
|
|
const sandboxedTmp = path.join(tmpdir.path, 'tmp');
|
|
|
|
fs.mkdirSync(sandbox);
|
|
fs.mkdirSync(sandboxedDir);
|
|
fs.mkdirSync(sandboxedTmp);
|
|
fs.writeFileSync(sandboxedFile, 'hello from input.txt', 'utf8');
|
|
fs.writeFileSync(externalFile, 'this should be inaccessible', 'utf8');
|
|
fs.symlinkSync(path.join('.', 'input.txt'), sandboxedSymlink, 'file');
|
|
fs.symlinkSync(path.join('..', 'outside.txt'), escapingSymlink, 'file');
|
|
fs.symlinkSync(path.join('subdir', 'loop2'),
|
|
loopSymlink1, 'file');
|
|
fs.symlinkSync(path.join('subdir', 'loop1'),
|
|
loopSymlink2, 'file');
|
|
|
|
function runWASI(options) {
|
|
console.log('executing', options.test);
|
|
const opts = { env: { ...process.env, NODE_DEBUG_NATIVE: 'wasi' } };
|
|
const child = cp.spawnSync(process.execPath, [
|
|
'--experimental-wasi-unstable-preview1',
|
|
__filename,
|
|
'wasi-child',
|
|
options.test,
|
|
sandbox,
|
|
sandboxedTmp,
|
|
], opts);
|
|
console.log(child.stderr.toString());
|
|
assert.strictEqual(child.status, 0);
|
|
assert.strictEqual(child.signal, null);
|
|
assert.strictEqual(child.stdout.toString(), options.stdout || '');
|
|
}
|
|
|
|
runWASI({ test: 'create_symlink', stdout: 'hello from input.txt' });
|
|
runWASI({ test: 'follow_symlink', stdout: 'hello from input.txt' });
|
|
runWASI({ test: 'link' });
|
|
runWASI({ test: 'symlink_escape' });
|
|
runWASI({ test: 'symlink_loop' });
|
|
}
|