1'use strict';
2const { mustNotCall } = require('../common');
3
4// Regression test for https://github.com/nodejs/node/issues/44768
5
6const { throws } = require('assert');
7const {
8  exec,
9  execFile,
10  execFileSync,
11  execSync,
12  fork,
13  spawn,
14  spawnSync,
15} = require('child_process');
16
17// Tests for the 'command' argument
18
19throws(() => exec(`${process.execPath} ${__filename} AAA BBB\0XXX CCC`, mustNotCall()), {
20  code: 'ERR_INVALID_ARG_VALUE',
21  message: /The argument 'command' must be a string without null bytes/
22});
23
24throws(() => exec('BBB\0XXX AAA CCC', mustNotCall()), {
25  code: 'ERR_INVALID_ARG_VALUE',
26  message: /The argument 'command' must be a string without null bytes/
27});
28
29throws(() => execSync(`${process.execPath} ${__filename} AAA BBB\0XXX CCC`), {
30  code: 'ERR_INVALID_ARG_VALUE',
31  message: /The argument 'command' must be a string without null bytes/
32});
33
34throws(() => execSync('BBB\0XXX AAA CCC'), {
35  code: 'ERR_INVALID_ARG_VALUE',
36  message: /The argument 'command' must be a string without null bytes/
37});
38
39// Tests for the 'file' argument
40
41throws(() => spawn('BBB\0XXX'), {
42  code: 'ERR_INVALID_ARG_VALUE',
43  message: /The argument 'file' must be a string without null bytes/
44});
45
46throws(() => execFile('BBB\0XXX', mustNotCall()), {
47  code: 'ERR_INVALID_ARG_VALUE',
48  message: /The argument 'file' must be a string without null bytes/
49});
50
51throws(() => execFileSync('BBB\0XXX'), {
52  code: 'ERR_INVALID_ARG_VALUE',
53  message: /The argument 'file' must be a string without null bytes/
54});
55
56throws(() => spawn('BBB\0XXX'), {
57  code: 'ERR_INVALID_ARG_VALUE',
58  message: /The argument 'file' must be a string without null bytes/
59});
60
61throws(() => spawnSync('BBB\0XXX'), {
62  code: 'ERR_INVALID_ARG_VALUE',
63  message: /The argument 'file' must be a string without null bytes/
64});
65
66// Tests for the 'modulePath' argument
67
68throws(() => fork('BBB\0XXX'), {
69  code: 'ERR_INVALID_ARG_VALUE',
70  message: /The argument 'modulePath' must be a string or Uint8Array without null bytes/
71});
72
73// Tests for the 'args' argument
74
75// Not testing exec() and execSync() because these accept 'args' as a part of
76// 'command' as space-separated arguments.
77
78throws(() => execFile(process.execPath, [__filename, 'AAA', 'BBB\0XXX', 'CCC'], mustNotCall()), {
79  code: 'ERR_INVALID_ARG_VALUE',
80  message: /The argument 'args\[2\]' must be a string without null bytes/
81});
82
83throws(() => execFileSync(process.execPath, [__filename, 'AAA', 'BBB\0XXX', 'CCC']), {
84  code: 'ERR_INVALID_ARG_VALUE',
85  message: /The argument 'args\[2\]' must be a string without null bytes/
86});
87
88throws(() => fork(__filename, ['AAA', 'BBB\0XXX', 'CCC']), {
89  code: 'ERR_INVALID_ARG_VALUE',
90  message: /The argument 'args\[2\]' must be a string without null bytes/
91});
92
93throws(() => spawn(process.execPath, [__filename, 'AAA', 'BBB\0XXX', 'CCC']), {
94  code: 'ERR_INVALID_ARG_VALUE',
95  message: /The argument 'args\[2\]' must be a string without null bytes/
96});
97
98throws(() => spawnSync(process.execPath, [__filename, 'AAA', 'BBB\0XXX', 'CCC']), {
99  code: 'ERR_INVALID_ARG_VALUE',
100  message: /The argument 'args\[2\]' must be a string without null bytes/
101});
102
103// Tests for the 'options.cwd' argument
104
105throws(() => exec(process.execPath, { cwd: 'BBB\0XXX' }, mustNotCall()), {
106  code: 'ERR_INVALID_ARG_VALUE',
107  message: /The property 'options\.cwd' must be a string or Uint8Array without null bytes/
108});
109
110throws(() => execFile(process.execPath, { cwd: 'BBB\0XXX' }, mustNotCall()), {
111  code: 'ERR_INVALID_ARG_VALUE',
112  message: /The property 'options\.cwd' must be a string or Uint8Array without null bytes/
113});
114
115throws(() => execFileSync(process.execPath, { cwd: 'BBB\0XXX' }), {
116  code: 'ERR_INVALID_ARG_VALUE',
117  message: /The property 'options\.cwd' must be a string or Uint8Array without null bytes/
118});
119
120throws(() => execSync(process.execPath, { cwd: 'BBB\0XXX' }), {
121  code: 'ERR_INVALID_ARG_VALUE',
122  message: /The property 'options\.cwd' must be a string or Uint8Array without null bytes/
123});
124
125throws(() => fork(__filename, { cwd: 'BBB\0XXX' }), {
126  code: 'ERR_INVALID_ARG_VALUE',
127  message: /The property 'options\.cwd' must be a string or Uint8Array without null bytes/
128});
129
130throws(() => spawn(process.execPath, { cwd: 'BBB\0XXX' }), {
131  code: 'ERR_INVALID_ARG_VALUE',
132  message: /The property 'options\.cwd' must be a string or Uint8Array without null bytes/
133});
134
135throws(() => spawnSync(process.execPath, { cwd: 'BBB\0XXX' }), {
136  code: 'ERR_INVALID_ARG_VALUE',
137  message: /The property 'options\.cwd' must be a string or Uint8Array without null bytes/
138});
139
140// Tests for the 'options.argv0' argument
141
142throws(() => exec(process.execPath, { argv0: 'BBB\0XXX' }, mustNotCall()), {
143  code: 'ERR_INVALID_ARG_VALUE',
144  message: /The property 'options\.argv0' must be a string without null bytes/
145});
146
147throws(() => execFile(process.execPath, { argv0: 'BBB\0XXX' }, mustNotCall()), {
148  code: 'ERR_INVALID_ARG_VALUE',
149  message: /The property 'options\.argv0' must be a string without null bytes/
150});
151
152throws(() => execFileSync(process.execPath, { argv0: 'BBB\0XXX' }), {
153  code: 'ERR_INVALID_ARG_VALUE',
154  message: /The property 'options\.argv0' must be a string without null bytes/
155});
156
157throws(() => execSync(process.execPath, { argv0: 'BBB\0XXX' }), {
158  code: 'ERR_INVALID_ARG_VALUE',
159  message: /The property 'options\.argv0' must be a string without null bytes/
160});
161
162throws(() => fork(__filename, { argv0: 'BBB\0XXX' }), {
163  code: 'ERR_INVALID_ARG_VALUE',
164  message: /The property 'options\.argv0' must be a string without null bytes/
165});
166
167throws(() => spawn(process.execPath, { argv0: 'BBB\0XXX' }), {
168  code: 'ERR_INVALID_ARG_VALUE',
169  message: /The property 'options\.argv0' must be a string without null bytes/
170});
171
172throws(() => spawnSync(process.execPath, { argv0: 'BBB\0XXX' }), {
173  code: 'ERR_INVALID_ARG_VALUE',
174  message: /The property 'options\.argv0' must be a string without null bytes/
175});
176
177// Tests for the 'options.shell' argument
178
179throws(() => exec(process.execPath, { shell: 'BBB\0XXX' }, mustNotCall()), {
180  code: 'ERR_INVALID_ARG_VALUE',
181  message: /The property 'options\.shell' must be a string without null bytes/
182});
183
184throws(() => execFile(process.execPath, { shell: 'BBB\0XXX' }, mustNotCall()), {
185  code: 'ERR_INVALID_ARG_VALUE',
186  message: /The property 'options\.shell' must be a string without null bytes/
187});
188
189throws(() => execFileSync(process.execPath, { shell: 'BBB\0XXX' }), {
190  code: 'ERR_INVALID_ARG_VALUE',
191  message: /The property 'options\.shell' must be a string without null bytes/
192});
193
194throws(() => execSync(process.execPath, { shell: 'BBB\0XXX' }), {
195  code: 'ERR_INVALID_ARG_VALUE',
196  message: /The property 'options\.shell' must be a string without null bytes/
197});
198
199// Not testing fork() because it doesn't accept the shell option (internally it
200// explicitly sets shell to false).
201
202throws(() => spawn(process.execPath, { shell: 'BBB\0XXX' }), {
203  code: 'ERR_INVALID_ARG_VALUE',
204  message: /The property 'options\.shell' must be a string without null bytes/
205});
206
207throws(() => spawnSync(process.execPath, { shell: 'BBB\0XXX' }), {
208  code: 'ERR_INVALID_ARG_VALUE',
209  message: /The property 'options\.shell' must be a string without null bytes/
210});
211
212// Tests for the 'options.env' argument
213
214throws(() => exec(process.execPath, { env: { 'AAA': 'BBB\0XXX' } }, mustNotCall()), {
215  code: 'ERR_INVALID_ARG_VALUE',
216  message: /The property 'options\.env\['AAA'\]' must be a string without null bytes/
217});
218
219throws(() => exec(process.execPath, { env: { 'BBB\0XXX': 'AAA' } }, mustNotCall()), {
220  code: 'ERR_INVALID_ARG_VALUE',
221  message: /The property 'options\.env\['BBB\0XXX'\]' must be a string without null bytes/
222});
223
224throws(() => execFile(process.execPath, { env: { 'AAA': 'BBB\0XXX' } }, mustNotCall()), {
225  code: 'ERR_INVALID_ARG_VALUE',
226  message: /The property 'options\.env\['AAA'\]' must be a string without null bytes/
227});
228
229throws(() => execFile(process.execPath, { env: { 'BBB\0XXX': 'AAA' } }, mustNotCall()), {
230  code: 'ERR_INVALID_ARG_VALUE',
231  message: /The property 'options\.env\['BBB\0XXX'\]' must be a string without null bytes/
232});
233
234throws(() => execFileSync(process.execPath, { env: { 'AAA': 'BBB\0XXX' } }), {
235  code: 'ERR_INVALID_ARG_VALUE',
236  message: /The property 'options\.env\['AAA'\]' must be a string without null bytes/
237});
238
239throws(() => execFileSync(process.execPath, { env: { 'BBB\0XXX': 'AAA' } }), {
240  code: 'ERR_INVALID_ARG_VALUE',
241  message: /The property 'options\.env\['BBB\0XXX'\]' must be a string without null bytes/
242});
243
244throws(() => execSync(process.execPath, { env: { 'AAA': 'BBB\0XXX' } }), {
245  code: 'ERR_INVALID_ARG_VALUE',
246  message: /The property 'options\.env\['AAA'\]' must be a string without null bytes/
247});
248
249throws(() => execSync(process.execPath, { env: { 'BBB\0XXX': 'AAA' } }), {
250  code: 'ERR_INVALID_ARG_VALUE',
251  message: /The property 'options\.env\['BBB\0XXX'\]' must be a string without null bytes/
252});
253
254throws(() => fork(__filename, { env: { 'AAA': 'BBB\0XXX' } }), {
255  code: 'ERR_INVALID_ARG_VALUE',
256  message: /The property 'options\.env\['AAA'\]' must be a string without null bytes/
257});
258
259throws(() => fork(__filename, { env: { 'BBB\0XXX': 'AAA' } }), {
260  code: 'ERR_INVALID_ARG_VALUE',
261  message: /The property 'options\.env\['BBB\0XXX'\]' must be a string without null bytes/
262});
263
264throws(() => spawn(process.execPath, { env: { 'AAA': 'BBB\0XXX' } }), {
265  code: 'ERR_INVALID_ARG_VALUE',
266  message: /The property 'options\.env\['AAA'\]' must be a string without null bytes/
267});
268
269throws(() => spawn(process.execPath, { env: { 'BBB\0XXX': 'AAA' } }), {
270  code: 'ERR_INVALID_ARG_VALUE',
271  message: /The property 'options\.env\['BBB\0XXX'\]' must be a string without null bytes/
272});
273
274throws(() => spawnSync(process.execPath, { env: { 'AAA': 'BBB\0XXX' } }), {
275  code: 'ERR_INVALID_ARG_VALUE',
276  message: /The property 'options\.env\['AAA'\]' must be a string without null bytes/
277});
278
279throws(() => spawnSync(process.execPath, { env: { 'BBB\0XXX': 'AAA' } }), {
280  code: 'ERR_INVALID_ARG_VALUE',
281  message: /The property 'options\.env\['BBB\0XXX'\]' must be a string without null bytes/
282});
283
284// Tests for the 'options.execPath' argument
285throws(() => fork(__filename, { execPath: 'BBB\0XXX' }), {
286  code: 'ERR_INVALID_ARG_VALUE',
287  message: /The property 'options\.execPath' must be a string without null bytes/
288});
289
290// Tests for the 'options.execArgv' argument
291throws(() => fork(__filename, { execArgv: ['AAA', 'BBB\0XXX', 'CCC'] }), {
292  code: 'ERR_INVALID_ARG_VALUE',
293  message: /The property 'options\.execArgv\[1\]' must be a string without null bytes/
294});
295