From f69de13bfe1102ff53aa93d40045352441880704 Mon Sep 17 00:00:00 2001 From: Alba Mendez Date: Fri, 28 Feb 2020 13:40:30 +0100 Subject: [PATCH] fs: fix writeFile[Sync] for non-seekable files Completely disables the use of positioned writes at writeFile and writeFileSync, which allows it to work with non-seekable files. Fixes: https://github.com/nodejs/node/issues/31926 PR-URL: https://github.com/nodejs/node/pull/32006 Reviewed-By: Anna Henningsen --- lib/fs.js | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/lib/fs.js b/lib/fs.js index a85b8ab29ebd1a..c4fce61a0efb65 100644 --- a/lib/fs.js +++ b/lib/fs.js @@ -1248,9 +1248,9 @@ function futimesSync(fd, atime, mtime) { handleErrorFromBinding(ctx); } -function writeAll(fd, isUserFd, buffer, offset, length, position, callback) { +function writeAll(fd, isUserFd, buffer, offset, length, callback) { // write(fd, buffer, offset, length, position, callback) - fs.write(fd, buffer, offset, length, position, (writeErr, written) => { + fs.write(fd, buffer, offset, length, null, (writeErr, written) => { if (writeErr) { if (isUserFd) { callback(writeErr); @@ -1268,10 +1268,7 @@ function writeAll(fd, isUserFd, buffer, offset, length, position, callback) { } else { offset += written; length -= written; - if (position !== null) { - position += written; - } - writeAll(fd, isUserFd, buffer, offset, length, position, callback); + writeAll(fd, isUserFd, buffer, offset, length, callback); } }); } @@ -1288,7 +1285,7 @@ function writeFile(path, data, options, callback) { if (isFd(path)) { const isUserFd = true; - writeAll(path, isUserFd, data, 0, data.byteLength, null, callback); + writeAll(path, isUserFd, data, 0, data.byteLength, callback); return; } @@ -1297,8 +1294,7 @@ function writeFile(path, data, options, callback) { callback(openErr); } else { const isUserFd = false; - const position = /a/.test(flag) ? null : 0; - writeAll(fd, isUserFd, data, 0, data.byteLength, position, callback); + writeAll(fd, isUserFd, data, 0, data.byteLength, callback); } }); } @@ -1318,15 +1314,11 @@ function writeFileSync(path, data, options) { let offset = 0; let length = data.byteLength; - let position = (/a/.test(flag) || isUserFd) ? null : 0; try { while (length > 0) { - const written = fs.writeSync(fd, data, offset, length, position); + const written = fs.writeSync(fd, data, offset, length); offset += written; length -= written; - if (position !== null) { - position += written; - } } } finally { if (!isUserFd) fs.closeSync(fd);