From 300ea7396fcb82a31df8c05312aeebae857f5ea2 Mon Sep 17 00:00:00 2001 From: Jon Moss Date: Fri, 22 Dec 2017 18:33:31 -0500 Subject: [PATCH] fs: extract out validateOffsetLengthWrite function MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/nodejs/node/pull/17682 Reviewed-By: Colin Ihrig Reviewed-By: James M Snell Reviewed-By: Luigi Pinca Reviewed-By: Anatoli Papirovski Reviewed-By: Joyee Cheung Reviewed-By: Matteo Collina Reviewed-By: Tobias Nießen --- lib/fs.js | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/lib/fs.js b/lib/fs.js index 2df03dd07e0..76bb78715c2 100644 --- a/lib/fs.js +++ b/lib/fs.js @@ -189,6 +189,21 @@ function validateOffsetLengthRead(offset, length, bufferLength) { } } +function validateOffsetLengthWrite(offset, length, byteLength) { + let err; + + if (offset > byteLength) { + err = new errors.RangeError('ERR_OUT_OF_RANGE', 'offset'); + } else if (offset + length > byteLength || offset + length > kMaxLength) { + err = new errors.RangeError('ERR_OUT_OF_RANGE', 'length'); + } + + if (err !== undefined) { + Error.captureStackTrace(err, validateOffsetLengthWrite); + throw err; + } +} + // Special case of `makeCallback()` that is specific to async `*stat()` calls as // an optimization, since the data passed back to the callback needs to be // transformed anyway. @@ -826,11 +841,7 @@ fs.write = function(fd, buffer, offset, length, position, callback) { length = buffer.length - offset; if (typeof position !== 'number') position = null; - const byteLength = buffer.byteLength; - if (offset > byteLength) - throw new errors.RangeError('ERR_OUT_OF_RANGE', 'offset'); - if (offset + length > byteLength || offset + length > kMaxLength) - throw new errors.RangeError('ERR_OUT_OF_RANGE', 'length'); + validateOffsetLengthWrite(offset, length, buffer.byteLength); return binding.writeBuffer(fd, buffer, offset, length, position, req); } @@ -865,11 +876,7 @@ fs.writeSync = function(fd, buffer, offset, length, position) { offset = 0; if (typeof length !== 'number') length = buffer.length - offset; - const byteLength = buffer.byteLength; - if (offset > byteLength) - throw new errors.RangeError('ERR_OUT_OF_RANGE', 'offset'); - if (offset + length > byteLength || offset + length > kMaxLength) - throw new errors.RangeError('ERR_OUT_OF_RANGE', 'length'); + validateOffsetLengthWrite(offset, length, buffer.byteLength); return binding.writeBuffer(fd, buffer, offset, length, position); } if (typeof buffer !== 'string')