From f6745e937046df78dde441e4ea084aeb604a3d6a Mon Sep 17 00:00:00 2001 From: eladkeyshawn Date: Fri, 9 Apr 2021 20:12:59 +0300 Subject: [PATCH] tls: fix `tlsSocket.setMaxSendFragment` abort PR-URL: https://github.com/nodejs/node/pull/38170 Fixes: https://github.com/nodejs/node/issues/38169 Reviewed-By: Benjamin Gruenbaum Reviewed-By: Luigi Pinca Reviewed-By: James M Snell --- lib/_tls_wrap.js | 4 ++- test/parallel/test-tls-max-send-fragment.js | 27 +++++++++++++++++++-- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/lib/_tls_wrap.js b/lib/_tls_wrap.js index 9ecd92021de17f..a54bd0d0d35777 100644 --- a/lib/_tls_wrap.js +++ b/lib/_tls_wrap.js @@ -86,9 +86,10 @@ const { const { validateBuffer, validateCallback, + validateInt32, validateObject, validateString, - validateUint32 + validateUint32, } = require('internal/validators'); const { InternalX509Certificate @@ -893,6 +894,7 @@ TLSSocket.prototype.exportKeyingMaterial = function(length, label, context) { }; TLSSocket.prototype.setMaxSendFragment = function setMaxSendFragment(size) { + validateInt32(size, 'size'); return this._handle.setMaxSendFragment(size) === 1; }; diff --git a/test/parallel/test-tls-max-send-fragment.js b/test/parallel/test-tls-max-send-fragment.js index eca995d66483b5..bbb7849f005bf9 100644 --- a/test/parallel/test-tls-max-send-fragment.js +++ b/test/parallel/test-tls-max-send-fragment.js @@ -33,15 +33,38 @@ const buf = Buffer.allocUnsafe(10000); let received = 0; const maxChunk = 768; +const invalidArgumentError = { + name: 'TypeError', + code: 'ERR_INVALID_ARG_TYPE' +}; + const server = tls.createServer({ key: fixtures.readKey('agent1-key.pem'), cert: fixtures.readKey('agent1-cert.pem') }, function(c) { - // Lower and upper limits + + // No size is passed. + assert.throws(() => c.setMaxSendFragment(), invalidArgumentError); + + // Invalid arg is passed. + [null, undefined, '', {}, false, true, []].forEach((arg) => { + assert.throws(() => c.setMaxSendFragment(arg), invalidArgumentError); + }); + + [NaN, Infinity, 2 ** 31].forEach((arg) => { + assert.throws(() => c.setMaxSendFragment(arg), { + name: 'RangeError', + code: 'ERR_OUT_OF_RANGE' + }); + }); + + assert.throws(() => c.setMaxSendFragment(Symbol()), { name: 'TypeError' }); + + // Lower and upper limits. assert(!c.setMaxSendFragment(511)); assert(!c.setMaxSendFragment(16385)); - // Correct fragment size + // Correct fragment size. assert(c.setMaxSendFragment(maxChunk)); c.end(buf);