|
1 | 1 | import * as common from '../common/index.mjs';
|
2 | 2 | import * as fixtures from '../common/fixtures.mjs';
|
3 | 3 | import { EOL } from 'node:os';
|
4 |
| -import { strictEqual } from 'node:assert'; |
| 4 | +import { strictEqual, notStrictEqual, throws } from 'node:assert'; |
5 | 5 | import cp from 'node:child_process';
|
6 | 6 |
|
7 | 7 | // TODO(LiviaMedeiros): test on different platforms
|
@@ -57,3 +57,35 @@ for (const tamperedUID of [0, 1, 999, 1000, 0n, 'gwak']) {
|
57 | 57 |
|
58 | 58 | delete Object.prototype.execPath;
|
59 | 59 | }
|
| 60 | + |
| 61 | +for (const shellCommandArgument of ['-L && echo "tampered"']) { |
| 62 | + Object.prototype.shell = true; |
| 63 | + const cmd = 'pwd'; |
| 64 | + let cmdExitCode = ''; |
| 65 | + |
| 66 | + const program = cp.spawn(cmd, [shellCommandArgument], { cwd: expectedCWD }); |
| 67 | + program.stderr.on('data', common.mustCall()); |
| 68 | + program.stdout.on('data', common.mustNotCall()); |
| 69 | + |
| 70 | + program.on('exit', common.mustCall((code) => { |
| 71 | + notStrictEqual(code, 0); |
| 72 | + })); |
| 73 | + |
| 74 | + cp.execFile(cmd, [shellCommandArgument], { cwd: expectedCWD }, |
| 75 | + common.mustCall((err) => { |
| 76 | + notStrictEqual(err.code, 0); |
| 77 | + }) |
| 78 | + ); |
| 79 | + |
| 80 | + throws(() => { |
| 81 | + cp.execFileSync(cmd, [shellCommandArgument], { cwd: expectedCWD }); |
| 82 | + }, (e) => { |
| 83 | + notStrictEqual(e.status, 0); |
| 84 | + return true; |
| 85 | + }); |
| 86 | + |
| 87 | + cmdExitCode = cp.spawnSync(cmd, [shellCommandArgument], { cwd: expectedCWD }).status; |
| 88 | + notStrictEqual(cmdExitCode, 0); |
| 89 | + |
| 90 | + delete Object.prototype.shell; |
| 91 | +} |
0 commit comments