From 071694472f6d54b24dfadb0d11f34428755bec13 Mon Sep 17 00:00:00 2001 From: cjihrig Date: Sat, 8 Jun 2019 08:48:05 -0400 Subject: [PATCH] dgram: fix abort on bad args This commit fixes a C++ abort for connected dgram sockets by improving input validation in the JS layer. Fixes: https://github.com/nodejs/node/issues/28126 PR-URL: https://github.com/nodejs/node/pull/28135 Reviewed-By: Richard Lau Reviewed-By: Yongsheng Zhang Reviewed-By: Ruben Bridgewater Reviewed-By: Santiago Gimeno Reviewed-By: Rich Trott Reviewed-By: James M Snell --- lib/dgram.js | 21 +++++++++++-------- .../parallel/test-dgram-send-bad-arguments.js | 9 ++++++++ 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/lib/dgram.js b/lib/dgram.js index cb20c4499ad981..e032a6f7fdcfb5 100644 --- a/lib/dgram.js +++ b/lib/dgram.js @@ -561,16 +561,19 @@ Socket.prototype.send = function(buffer, port = offset; address = length; } - } else if (typeof length === 'number') { - buffer = sliceBuffer(buffer, offset, length); - if (typeof port === 'function') { - callback = port; - port = null; - } else if (port || address) { - throw new ERR_SOCKET_DGRAM_IS_CONNECTED(); - } } else { - callback = offset; + if (typeof length === 'number') { + buffer = sliceBuffer(buffer, offset, length); + if (typeof port === 'function') { + callback = port; + port = null; + } + } else { + callback = offset; + } + + if (port || address) + throw new ERR_SOCKET_DGRAM_IS_CONNECTED(); } if (!Array.isArray(buffer)) { diff --git a/test/parallel/test-dgram-send-bad-arguments.js b/test/parallel/test-dgram-send-bad-arguments.js index 467efbb7b94a2c..f8f2a2de1368d5 100644 --- a/test/parallel/test-dgram-send-bad-arguments.js +++ b/test/parallel/test-dgram-send-bad-arguments.js @@ -68,6 +68,15 @@ function checkArgs(connected) { message: 'Already connected' } ); + + common.expectsError( + () => { sock.send(buf, 1234, '127.0.0.1', common.mustNotCall()); }, + { + code: 'ERR_SOCKET_DGRAM_IS_CONNECTED', + type: Error, + message: 'Already connected' + } + ); } else { assert.throws(() => { sock.send(buf, 1, 1, -1, host); }, RangeError); assert.throws(() => { sock.send(buf, 1, 1, 0, host); }, RangeError);