Skip to content

Commit 8043755

Browse files
committed
lib: add empty buffer case to read and readSync function in fs
While using read() or readSync() function, it should be verified that the arguments of the function are in proper range and hold legitimate values, for a successful read process. For this validateOffsetLengthRead() function is called, which gives an error message for offset and length passed by the user, if not in order. But there should also be an error when an empty buffer is passed as argument, when it cannot be written over. The empty buffer case should be checked before calling validateOffsetLengthRead() and ERR_INVALID_ARG_VALUE should be thrown corresponding to the empty buffer argument in read and readSync function. Fixes: nodejs#21193
1 parent 7c1d365 commit 8043755

File tree

4 files changed

+20
-9
lines changed

4 files changed

+20
-9
lines changed

lib/fs.js

+11
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ const { Buffer, kMaxLength } = require('buffer');
4747
const errors = require('internal/errors');
4848
const {
4949
ERR_FS_FILE_TOO_LARGE,
50+
ERR_INVALID_ARG_VALUE,
5051
ERR_INVALID_ARG_TYPE,
5152
ERR_INVALID_CALLBACK
5253
} = errors.codes;
@@ -457,6 +458,11 @@ function read(fd, buffer, offset, length, position, callback) {
457458
});
458459
}
459460

461+
if (buffer.length === 0) {
462+
throw new ERR_INVALID_ARG_VALUE('buffer', buffer,
463+
'is empty and cannot be written');
464+
}
465+
460466
validateOffsetLengthRead(offset, length, buffer.length);
461467

462468
if (!Number.isSafeInteger(position))
@@ -487,6 +493,11 @@ function readSync(fd, buffer, offset, length, position) {
487493
return 0;
488494
}
489495

496+
if (buffer.length === 0) {
497+
throw new ERR_INVALID_ARG_VALUE('buffer', buffer,
498+
'is empty and cannot be written');
499+
}
500+
490501
validateOffsetLengthRead(offset, length, buffer.length);
491502

492503
if (!Number.isSafeInteger(position))

lib/internal/fs/promises.js

+6
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ const { Buffer, kMaxLength } = require('buffer');
1212
const {
1313
ERR_FS_FILE_TOO_LARGE,
1414
ERR_INVALID_ARG_TYPE,
15+
ERR_INVALID_ARG_VALUE,
1516
ERR_METHOD_NOT_IMPLEMENTED
1617
} = require('internal/errors').codes;
1718
const { getPathFromURL } = require('internal/url');
@@ -207,6 +208,11 @@ async function read(handle, buffer, offset, length, position) {
207208
if (length === 0)
208209
return { bytesRead: length, buffer };
209210

211+
if (buffer.length === 0) {
212+
throw new ERR_INVALID_ARG_VALUE('buffer', buffer,
213+
'is empty and cannot be written');
214+
}
215+
210216
validateOffsetLengthRead(offset, length, buffer.length);
211217

212218
if (!Number.isSafeInteger(position))

lib/internal/fs/utils.js

+2-6
Original file line numberDiff line numberDiff line change
@@ -293,12 +293,8 @@ function validateOffsetLengthRead(offset, length, bufferLength) {
293293
let err;
294294

295295
if (offset < 0 || offset >= bufferLength) {
296-
if (bufferLength === 0) {
297-
err = new ERR_OUT_OF_RANGE('bufferLength', '> 0', bufferLength);
298-
} else {
299-
err = new ERR_OUT_OF_RANGE('offset',
300-
`>= 0 && <= ${bufferLength}`, offset);
301-
}
296+
err = new ERR_OUT_OF_RANGE('offset',
297+
`>= 0 && <= ${bufferLength}`, offset);
302298
} else if (length < 0 || offset + length > bufferLength) {
303299
err = new ERR_OUT_OF_RANGE('length',
304300
`>= 0 && <= ${bufferLength - offset}`, length);

test/parallel/test-fs-read-empty-buffer.js

+1-3
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@ const buffer = new Uint8Array();
1111
assert.throws(
1212
() => fs.readSync(fd, buffer, 0, 10, 0),
1313
{
14-
code: 'ERR_OUT_OF_RANGE',
15-
message: 'The value of "bufferLength" is out of range. ' +
16-
'It must be > 0. Received 0'
14+
code: 'ERR_INVALID_ARG_VALUE',
1715
}
1816
);

0 commit comments

Comments
 (0)