child_process: ensure message sanity at source

Error messages coming out of de-serialization at the send target
is not consumable. So detect the scenario and fix it at the send source

Ref: https://github.com/nodejs/node/issues/20314

PR-URL: https://github.com/nodejs/node/pull/24787
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
This commit is contained in:
Gireesh Punathil 2018-12-02 19:53:28 +05:30
parent 993bdff9ff
commit daa97df343
2 changed files with 18 additions and 0 deletions

View File

@ -665,6 +665,18 @@ function setupChannel(target, channel) {
if (message === undefined)
throw new ERR_MISSING_ARGS('message');
// Non-serializable messages should not reach the remote
// end point; as any failure in the stringification there
// will result in error message that is weakly consumable.
// So perform a sanity check on message prior to sending.
if (typeof message !== 'string' &&
typeof message !== 'object' &&
typeof message !== 'number' &&
typeof message !== 'boolean') {
throw new ERR_INVALID_ARG_TYPE(
'message', ['string', 'object', 'number', 'boolean'], message);
}
// Support legacy function signature
if (typeof options === 'boolean') {
options = { swallowErrors: options };

View File

@ -49,6 +49,12 @@ assert.throws(() => n.send(), {
code: 'ERR_MISSING_ARGS'
});
assert.throws(() => n.send(Symbol()), {
name: 'TypeError [ERR_INVALID_ARG_TYPE]',
message: 'The "message" argument must be one of type string,' +
' object, number, or boolean. Received type symbol',
code: 'ERR_INVALID_ARG_TYPE'
});
n.send({ hello: 'world' });
n.on('exit', common.mustCall((c) => {