From 42bded83e8b71dda885c173d33b0190cdee3d0da Mon Sep 17 00:00:00 2001 From: AdityaSrivast Date: Mon, 11 Jun 2018 19:14:52 +0530 Subject: [PATCH] fs: throw ERR_INVALID_ARG_VALUE when buffer being written is empty Fixes: https://github.com/nodejs/node/issues/21193 PR-URL: https://github.com/nodejs/node/pull/21262 Reviewed-By: Joyee Cheung Reviewed-By: James M Snell --- lib/fs.js | 11 +++++++++++ lib/internal/fs/promises.js | 6 ++++++ lib/internal/fs/utils.js | 3 ++- test/parallel/test-fs-read-empty-buffer.js | 18 ++++++++++++++++++ 4 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 test/parallel/test-fs-read-empty-buffer.js diff --git a/lib/fs.js b/lib/fs.js index d770c6ecd2dd6e..2c2a053c7f9bf9 100644 --- a/lib/fs.js +++ b/lib/fs.js @@ -47,6 +47,7 @@ const { Buffer, kMaxLength } = require('buffer'); const errors = require('internal/errors'); const { ERR_FS_FILE_TOO_LARGE, + ERR_INVALID_ARG_VALUE, ERR_INVALID_ARG_TYPE, ERR_INVALID_CALLBACK } = errors.codes; @@ -457,6 +458,11 @@ function read(fd, buffer, offset, length, position, callback) { }); } + if (buffer.length === 0) { + throw new ERR_INVALID_ARG_VALUE('buffer', buffer, + 'is empty and cannot be written'); + } + validateOffsetLengthRead(offset, length, buffer.length); if (!Number.isSafeInteger(position)) @@ -487,6 +493,11 @@ function readSync(fd, buffer, offset, length, position) { return 0; } + if (buffer.length === 0) { + throw new ERR_INVALID_ARG_VALUE('buffer', buffer, + 'is empty and cannot be written'); + } + validateOffsetLengthRead(offset, length, buffer.length); if (!Number.isSafeInteger(position)) diff --git a/lib/internal/fs/promises.js b/lib/internal/fs/promises.js index fac430bbe227e1..f38a3e59befc05 100644 --- a/lib/internal/fs/promises.js +++ b/lib/internal/fs/promises.js @@ -12,6 +12,7 @@ const { Buffer, kMaxLength } = require('buffer'); const { ERR_FS_FILE_TOO_LARGE, ERR_INVALID_ARG_TYPE, + ERR_INVALID_ARG_VALUE, ERR_METHOD_NOT_IMPLEMENTED } = require('internal/errors').codes; const { getPathFromURL } = require('internal/url'); @@ -208,6 +209,11 @@ async function read(handle, buffer, offset, length, position) { if (length === 0) return { bytesRead: length, buffer }; + if (buffer.length === 0) { + throw new ERR_INVALID_ARG_VALUE('buffer', buffer, + 'is empty and cannot be written'); + } + validateOffsetLengthRead(offset, length, buffer.length); if (!Number.isSafeInteger(position)) diff --git a/lib/internal/fs/utils.js b/lib/internal/fs/utils.js index 7aa19605e92a6a..a2f1015c62b8ff 100644 --- a/lib/internal/fs/utils.js +++ b/lib/internal/fs/utils.js @@ -293,7 +293,8 @@ function validateOffsetLengthRead(offset, length, bufferLength) { let err; if (offset < 0 || offset >= bufferLength) { - err = new ERR_OUT_OF_RANGE('offset', `>= 0 && <= ${bufferLength}`, offset); + err = new ERR_OUT_OF_RANGE('offset', + `>= 0 && <= ${bufferLength}`, offset); } else if (length < 0 || offset + length > bufferLength) { err = new ERR_OUT_OF_RANGE('length', `>= 0 && <= ${bufferLength - offset}`, length); diff --git a/test/parallel/test-fs-read-empty-buffer.js b/test/parallel/test-fs-read-empty-buffer.js new file mode 100644 index 00000000000000..281d2675e72730 --- /dev/null +++ b/test/parallel/test-fs-read-empty-buffer.js @@ -0,0 +1,18 @@ +'use strict'; +require('../common'); +const fixtures = require('../common/fixtures'); +const assert = require('assert'); +const fs = require('fs'); +const filepath = fixtures.path('x.txt'); +const fd = fs.openSync(filepath, 'r'); + +const buffer = new Uint8Array(); + +assert.throws( + () => fs.readSync(fd, buffer, 0, 10, 0), + { + code: 'ERR_INVALID_ARG_VALUE', + message: 'The argument \'buffer\' is empty and cannot be written. ' + + 'Received Uint8Array [ ]' + } +);