From fc8c1b1ded9f21fb7e4f97cbcc4bc4d419c23b52 Mon Sep 17 00:00:00 2001 From: Jon Moss Date: Wed, 13 Dec 2017 17:29:03 -0500 Subject: [PATCH] fs: extract out validateOffsetLengthRead 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 2a1fa8c5a3f..c1f24608de2 100644 --- a/lib/fs.js +++ b/lib/fs.js @@ -165,6 +165,21 @@ function validateFd(fd) { } } +function validateOffsetLengthRead(offset, length, bufferLength) { + let err; + + if (offset < 0 || offset >= bufferLength) { + err = new errors.RangeError('ERR_OUT_OF_RANGE', 'offset'); + } else if (length < 0 || offset + length > bufferLength) { + err = new errors.RangeError('ERR_OUT_OF_RANGE', 'length'); + } + + if (err !== undefined) { + Error.captureStackTrace(err, validateOffsetLengthRead); + 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. @@ -743,11 +758,7 @@ fs.read = function(fd, buffer, offset, length, position, callback) { }); } - if (offset < 0 || offset >= buffer.length) - throw new errors.RangeError('ERR_OUT_OF_RANGE', 'offset'); - - if (length < 0 || offset + length > buffer.length) - throw new errors.RangeError('ERR_OUT_OF_RANGE', 'length'); + validateOffsetLengthRead(offset, length, buffer.length); if (!isUint32(position)) position = -1; @@ -779,11 +790,7 @@ fs.readSync = function(fd, buffer, offset, length, position) { return 0; } - if (offset < 0 || offset >= buffer.length) - throw new errors.RangeError('ERR_OUT_OF_RANGE', 'offset'); - - if (length < 0 || offset + length > buffer.length) - throw new errors.RangeError('ERR_OUT_OF_RANGE', 'length'); + validateOffsetLengthRead(offset, length, buffer.length); if (!isUint32(position)) position = -1;