Skip to content

Commit

Permalink
fs: fix writeFile[Sync] for non-seekable files
Browse files Browse the repository at this point in the history
Completely disables the use of positioned writes at
writeFile and writeFileSync, which allows it to work
with non-seekable files.

Fixes: nodejs#31926

PR-URL: nodejs#32006
Reviewed-By: Anna Henningsen <anna@addaleax.net>
  • Loading branch information
mildsunrise committed Mar 10, 2020
1 parent 4640ea2 commit 33ca1a6
Showing 1 changed file with 5 additions and 13 deletions.
18 changes: 5 additions & 13 deletions lib/fs.js
Original file line number Diff line number Diff line change
Expand Up @@ -1240,9 +1240,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);
Expand All @@ -1260,10 +1260,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);
}
});
}
Expand All @@ -1289,9 +1286,8 @@ function writeFile(path, data, options, callback) {
function writeFd(fd, isUserFd) {
const buffer = isArrayBufferView(data) ?
data : Buffer.from('' + data, options.encoding || 'utf8');
const position = (/a/.test(flag) || isUserFd) ? null : 0;

writeAll(fd, isUserFd, buffer, 0, buffer.byteLength, position, callback);
writeAll(fd, isUserFd, buffer, 0, buffer.byteLength, callback);
}
}

Expand All @@ -1307,15 +1303,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);
Expand Down

0 comments on commit 33ca1a6

Please sign in to comment.