Skip to content

Commit 5fa4455

Browse files
benjamingrbengl
authored andcommitted
fs: fix cb/sync writev empty array behavior
PR-URL: #41932 Refs: #41910 Reviewed-By: Antoine du Hamel <[email protected]> Reviewed-By: Robert Nagy <[email protected]> Reviewed-By: James M Snell <[email protected]>
1 parent 50a0a22 commit 5fa4455

File tree

3 files changed

+40
-2
lines changed

3 files changed

+40
-2
lines changed

lib/fs.js

+9
Original file line numberDiff line numberDiff line change
@@ -907,6 +907,11 @@ function writev(fd, buffers, position, callback) {
907907
validateBufferArray(buffers);
908908
callback = maybeCallback(callback || position);
909909

910+
if (buffers.length === 0) {
911+
process.nextTick(callback, null, 0, buffers);
912+
return;
913+
}
914+
910915
const req = new FSReqCallback();
911916
req.oncomplete = wrapper;
912917

@@ -933,6 +938,10 @@ function writevSync(fd, buffers, position) {
933938
fd = getValidatedFd(fd);
934939
validateBufferArray(buffers);
935940

941+
if (buffers.length === 0) {
942+
return 0;
943+
}
944+
936945
const ctx = {};
937946

938947
if (typeof position !== 'number')

test/parallel/test-fs-writev-sync.js

+11-1
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,21 @@ const getFileName = (i) => path.join(tmpdir.path, `writev_sync_${i}.txt`);
5656
assert(Buffer.concat(bufferArr).equals(fs.readFileSync(filename)));
5757
}
5858

59+
// fs.writevSync with empty array of buffers
60+
{
61+
const filename = getFileName(3);
62+
const fd = fs.openSync(filename, 'w');
63+
const written = fs.writevSync(fd, []);
64+
assert.strictEqual(written, 0);
65+
fs.closeSync(fd);
66+
67+
}
68+
5969
/**
6070
* Testing with wrong input types
6171
*/
6272
{
63-
const filename = getFileName(3);
73+
const filename = getFileName(4);
6474
const fd = fs.openSync(filename, 'w');
6575

6676
[false, 'test', {}, [{}], ['sdf'], null, undefined].forEach((i) => {

test/parallel/test-fs-writev.js

+20-1
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,30 @@ const getFileName = (i) => path.join(tmpdir.path, `writev_${i}.txt`);
5757
fs.writev(fd, bufferArr, done);
5858
}
5959

60+
61+
// fs.writev with empty array of buffers
62+
{
63+
const filename = getFileName(3);
64+
const fd = fs.openSync(filename, 'w');
65+
const bufferArr = [];
66+
let afterSyncCall = false;
67+
68+
const done = common.mustSucceed((written, buffers) => {
69+
assert.strictEqual(buffers.length, 0);
70+
assert.strictEqual(written, 0);
71+
assert(afterSyncCall);
72+
fs.closeSync(fd);
73+
});
74+
75+
fs.writev(fd, bufferArr, done);
76+
afterSyncCall = true;
77+
}
78+
6079
/**
6180
* Testing with wrong input types
6281
*/
6382
{
64-
const filename = getFileName(3);
83+
const filename = getFileName(4);
6584
const fd = fs.openSync(filename, 'w');
6685

6786
[false, 'test', {}, [{}], ['sdf'], null, undefined].forEach((i) => {

0 commit comments

Comments
 (0)