child_process: allow Infinity as maxBuffer value
Fixes: https://github.com/nodejs/node/pull/10767 PR-URL: https://github.com/nodejs/node/pull/10769 Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
parent
0f0f3d3330
commit
8f3ff98f0e
@ -146,6 +146,12 @@ exports.execFile = function(file /*, args, options, callback*/) {
|
|||||||
throw new TypeError('Incorrect value of args option');
|
throw new TypeError('Incorrect value of args option');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Validate the timeout, if present.
|
||||||
|
validateTimeout(options.timeout);
|
||||||
|
|
||||||
|
// Validate maxBuffer, if present.
|
||||||
|
validateMaxBuffer(options.maxBuffer);
|
||||||
|
|
||||||
var child = spawn(file, args, {
|
var child = spawn(file, args, {
|
||||||
cwd: options.cwd,
|
cwd: options.cwd,
|
||||||
env: options.env,
|
env: options.env,
|
||||||
@ -466,31 +472,17 @@ function spawnSync(/*file, args, options*/) {
|
|||||||
debug('spawnSync', opts.args, options);
|
debug('spawnSync', opts.args, options);
|
||||||
|
|
||||||
// Validate the timeout, if present.
|
// Validate the timeout, if present.
|
||||||
if (options.timeout != null &&
|
validateTimeout(options.timeout);
|
||||||
!(Number.isInteger(options.timeout) && options.timeout >= 0)) {
|
|
||||||
throw new TypeError('"timeout" must be an unsigned integer');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Validate maxBuffer, if present.
|
// Validate maxBuffer, if present.
|
||||||
if (options.maxBuffer != null &&
|
validateMaxBuffer(options.maxBuffer);
|
||||||
!(Number.isInteger(options.maxBuffer) && options.maxBuffer >= 0)) {
|
|
||||||
throw new TypeError('"maxBuffer" must be an unsigned integer');
|
|
||||||
}
|
|
||||||
|
|
||||||
options.file = opts.file;
|
options.file = opts.file;
|
||||||
options.args = opts.args;
|
options.args = opts.args;
|
||||||
options.envPairs = opts.envPairs;
|
options.envPairs = opts.envPairs;
|
||||||
|
|
||||||
// Validate the kill signal, if present.
|
// Validate and translate the kill signal, if present.
|
||||||
if (typeof options.killSignal === 'string' ||
|
options.killSignal = validateKillSignal(options.killSignal);
|
||||||
typeof options.killSignal === 'number') {
|
|
||||||
options.killSignal = lookupSignal(options.killSignal);
|
|
||||||
|
|
||||||
if (options.killSignal === 0)
|
|
||||||
throw new RangeError('"killSignal" cannot be 0');
|
|
||||||
} else if (options.killSignal != null) {
|
|
||||||
throw new TypeError('"killSignal" must be a string or number');
|
|
||||||
}
|
|
||||||
|
|
||||||
options.stdio = _validateStdio(options.stdio || 'pipe', true).stdio;
|
options.stdio = _validateStdio(options.stdio || 'pipe', true).stdio;
|
||||||
|
|
||||||
@ -600,3 +592,31 @@ function execSync(command /*, options*/) {
|
|||||||
return ret.stdout;
|
return ret.stdout;
|
||||||
}
|
}
|
||||||
exports.execSync = execSync;
|
exports.execSync = execSync;
|
||||||
|
|
||||||
|
|
||||||
|
function validateTimeout(timeout) {
|
||||||
|
if (timeout != null && !(Number.isInteger(timeout) && timeout >= 0)) {
|
||||||
|
throw new TypeError('"timeout" must be an unsigned integer');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function validateMaxBuffer(maxBuffer) {
|
||||||
|
if (maxBuffer != null && !(typeof maxBuffer === 'number' && maxBuffer >= 0)) {
|
||||||
|
throw new TypeError('"maxBuffer" must be a positive number');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function validateKillSignal(killSignal) {
|
||||||
|
if (typeof killSignal === 'string' || typeof killSignal === 'number') {
|
||||||
|
killSignal = lookupSignal(killSignal);
|
||||||
|
|
||||||
|
if (killSignal === 0)
|
||||||
|
throw new RangeError('"killSignal" cannot be 0');
|
||||||
|
} else if (killSignal != null) {
|
||||||
|
throw new TypeError('"killSignal" must be a string or number');
|
||||||
|
}
|
||||||
|
|
||||||
|
return killSignal;
|
||||||
|
}
|
||||||
|
@ -765,8 +765,8 @@ int SyncProcessRunner::ParseOptions(Local<Value> js_value) {
|
|||||||
|
|
||||||
Local<Value> js_max_buffer = js_options->Get(env()->max_buffer_string());
|
Local<Value> js_max_buffer = js_options->Get(env()->max_buffer_string());
|
||||||
if (IsSet(js_max_buffer)) {
|
if (IsSet(js_max_buffer)) {
|
||||||
CHECK(js_max_buffer->IsUint32());
|
CHECK(js_max_buffer->IsNumber());
|
||||||
max_buffer_ = js_max_buffer->Uint32Value();
|
max_buffer_ = js_max_buffer->NumberValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
Local<Value> js_kill_signal = js_options->Get(env()->kill_signal_string());
|
Local<Value> js_kill_signal = js_options->Get(env()->kill_signal_string());
|
||||||
|
@ -184,7 +184,7 @@ class SyncProcessRunner {
|
|||||||
static void KillTimerCallback(uv_timer_t* handle);
|
static void KillTimerCallback(uv_timer_t* handle);
|
||||||
static void KillTimerCloseCallback(uv_handle_t* handle);
|
static void KillTimerCloseCallback(uv_handle_t* handle);
|
||||||
|
|
||||||
size_t max_buffer_;
|
double max_buffer_;
|
||||||
uint64_t timeout_;
|
uint64_t timeout_;
|
||||||
int kill_signal_;
|
int kill_signal_;
|
||||||
|
|
||||||
|
@ -10,6 +10,17 @@ function checkFactory(streamName) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
const cmd = `"${process.execPath}" -e "console.log('hello world');"`;
|
||||||
|
const options = { maxBuffer: Infinity };
|
||||||
|
|
||||||
|
cp.exec(cmd, options, common.mustCall((err, stdout, stderr) => {
|
||||||
|
assert.ifError(err);
|
||||||
|
assert.strictEqual(stdout.trim(), 'hello world');
|
||||||
|
assert.strictEqual(stderr, '');
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
const cmd = 'echo "hello world"';
|
const cmd = 'echo "hello world"';
|
||||||
|
|
||||||
|
@ -163,16 +163,17 @@ if (!common.isWindows) {
|
|||||||
|
|
||||||
{
|
{
|
||||||
// Validate the maxBuffer option
|
// Validate the maxBuffer option
|
||||||
const err = /^TypeError: "maxBuffer" must be an unsigned integer$/;
|
const err = /^TypeError: "maxBuffer" must be a positive number$/;
|
||||||
|
|
||||||
pass('maxBuffer', undefined);
|
pass('maxBuffer', undefined);
|
||||||
pass('maxBuffer', null);
|
pass('maxBuffer', null);
|
||||||
pass('maxBuffer', 1);
|
pass('maxBuffer', 1);
|
||||||
pass('maxBuffer', 0);
|
pass('maxBuffer', 0);
|
||||||
fail('maxBuffer', 3.14, err);
|
pass('maxBuffer', Infinity);
|
||||||
|
pass('maxBuffer', 3.14);
|
||||||
fail('maxBuffer', -1, err);
|
fail('maxBuffer', -1, err);
|
||||||
fail('maxBuffer', NaN, err);
|
fail('maxBuffer', NaN, err);
|
||||||
fail('maxBuffer', Infinity, err);
|
fail('maxBuffer', -Infinity, err);
|
||||||
fail('maxBuffer', true, err);
|
fail('maxBuffer', true, err);
|
||||||
fail('maxBuffer', false, err);
|
fail('maxBuffer', false, err);
|
||||||
fail('maxBuffer', __dirname, err);
|
fail('maxBuffer', __dirname, err);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user