From bfb51c53bfb87cc730868cc99d5e2fccbbac4822 Mon Sep 17 00:00:00 2001 From: Benjamin Gruenbaum Date: Fri, 11 Feb 2022 12:32:10 +0200 Subject: [PATCH 1/2] fs: fix cb/sync writev empty array behavior --- lib/fs.js | 9 +++++++++ test/parallel/test-fs-writev-sync.js | 12 +++++++++++- test/parallel/test-fs-writev.js | 18 +++++++++++++++++- 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/lib/fs.js b/lib/fs.js index c551599a534a67..876894d4b8a9ad 100644 --- a/lib/fs.js +++ b/lib/fs.js @@ -906,6 +906,11 @@ function writev(fd, buffers, position, callback) { validateBufferArray(buffers); callback = maybeCallback(callback || position); + if (buffers.length === 0) { + callback(null, 0, buffers); + return; + } + const req = new FSReqCallback(); req.oncomplete = wrapper; @@ -932,6 +937,10 @@ function writevSync(fd, buffers, position) { fd = getValidatedFd(fd); validateBufferArray(buffers); + if (buffers.length === 0) { + return 0; + } + const ctx = {}; if (typeof position !== 'number') diff --git a/test/parallel/test-fs-writev-sync.js b/test/parallel/test-fs-writev-sync.js index 33b76c7af25d9f..1db437972ed29d 100644 --- a/test/parallel/test-fs-writev-sync.js +++ b/test/parallel/test-fs-writev-sync.js @@ -56,11 +56,21 @@ const getFileName = (i) => path.join(tmpdir.path, `writev_sync_${i}.txt`); assert(Buffer.concat(bufferArr).equals(fs.readFileSync(filename))); } +// fs.writevSync with empty array of buffers +{ + const filename = getFileName(3); + const fd = fs.openSync(filename, 'w'); + const written = fs.writevSync(fd, []); + assert.strictEqual(written, 0); + fs.closeSync(fd); + +} + /** * Testing with wrong input types */ { - const filename = getFileName(3); + const filename = getFileName(4); const fd = fs.openSync(filename, 'w'); [false, 'test', {}, [{}], ['sdf'], null, undefined].forEach((i) => { diff --git a/test/parallel/test-fs-writev.js b/test/parallel/test-fs-writev.js index a516f9c328f1b2..9a47045fecf22a 100644 --- a/test/parallel/test-fs-writev.js +++ b/test/parallel/test-fs-writev.js @@ -57,11 +57,27 @@ const getFileName = (i) => path.join(tmpdir.path, `writev_${i}.txt`); fs.writev(fd, bufferArr, done); } + +// fs.writev with empty array of buffers +{ + const filename = getFileName(3); + const fd = fs.openSync(filename, 'w'); + const bufferArr = []; + + const done = common.mustSucceed((written, buffers) => { + assert.strictEqual(buffers.length, 0); + assert.strictEqual(written, 0); + fs.closeSync(fd); + }); + + fs.writev(fd, bufferArr, done); +} + /** * Testing with wrong input types */ { - const filename = getFileName(3); + const filename = getFileName(4); const fd = fs.openSync(filename, 'w'); [false, 'test', {}, [{}], ['sdf'], null, undefined].forEach((i) => { From 46c44a8ae989bd76087d00ce25a431e035819d24 Mon Sep 17 00:00:00 2001 From: Benjamin Gruenbaum Date: Fri, 11 Feb 2022 12:45:57 +0200 Subject: [PATCH 2/2] fixup! ensure cb behavior --- lib/fs.js | 2 +- test/parallel/test-fs-writev.js | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/fs.js b/lib/fs.js index 876894d4b8a9ad..435fce061f513e 100644 --- a/lib/fs.js +++ b/lib/fs.js @@ -907,7 +907,7 @@ function writev(fd, buffers, position, callback) { callback = maybeCallback(callback || position); if (buffers.length === 0) { - callback(null, 0, buffers); + process.nextTick(callback, null, 0, buffers); return; } diff --git a/test/parallel/test-fs-writev.js b/test/parallel/test-fs-writev.js index 9a47045fecf22a..7ea52ef77ac4ee 100644 --- a/test/parallel/test-fs-writev.js +++ b/test/parallel/test-fs-writev.js @@ -63,14 +63,17 @@ const getFileName = (i) => path.join(tmpdir.path, `writev_${i}.txt`); const filename = getFileName(3); const fd = fs.openSync(filename, 'w'); const bufferArr = []; + let afterSyncCall = false; const done = common.mustSucceed((written, buffers) => { assert.strictEqual(buffers.length, 0); assert.strictEqual(written, 0); + assert(afterSyncCall); fs.closeSync(fd); }); fs.writev(fd, bufferArr, done); + afterSyncCall = true; } /**