Skip to content

Commit 92d7b6c

Browse files
cjihrigevanlucas
authored andcommitted
fs: fix promises reads with pos > 4GB
PR-URL: #21148 Fixes: #21121 Refs: #21003 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com> Reviewed-By: Refael Ackermann <refack@gmail.com> Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com> Reviewed-By: Ujjwal Sharma <usharma1998@gmail.com>
1 parent 8e97948 commit 92d7b6c

File tree

2 files changed

+15
-2
lines changed

2 files changed

+15
-2
lines changed

lib/internal/fs/promises.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ const {
3333
validatePath
3434
} = require('internal/fs/utils');
3535
const {
36-
isUint32,
3736
validateInt32,
3837
validateUint32
3938
} = require('internal/validators');
@@ -213,7 +212,7 @@ async function read(handle, buffer, offset, length, position) {
213212

214213
validateOffsetLengthRead(offset, length, buffer.length);
215214

216-
if (!isUint32(position))
215+
if (!Number.isSafeInteger(position))
217216
position = -1;
218217

219218
const bytesRead = (await binding.read(handle.fd, buffer, offset, length,

test/parallel/test-fs-promises-file-handle-read.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ const common = require('../common');
88
const fs = require('fs');
99
const { open } = fs.promises;
1010
const path = require('path');
11+
const fixtures = require('../common/fixtures');
1112
const tmpdir = require('../common/tmpdir');
1213
const assert = require('assert');
1314
const tmpDir = tmpdir.path;
@@ -40,6 +41,19 @@ async function validateEmptyRead() {
4041
assert.deepStrictEqual(buffer.length, readAsyncHandle.bytesRead);
4142
}
4243

44+
async function validateLargeRead() {
45+
// Reading beyond file length (3 in this case) should return no data.
46+
// This is a test for a bug where reads > uint32 would return data
47+
// from the current position in the file.
48+
const filePath = fixtures.path('x.txt');
49+
const fileHandle = await open(filePath, 'r');
50+
const pos = 0xffffffff + 1; // max-uint32 + 1
51+
const readHandle = await fileHandle.read(Buffer.alloc(1), 0, 1, pos);
52+
53+
assert.strictEqual(readHandle.bytesRead, 0);
54+
}
55+
4356
validateRead()
4457
.then(validateEmptyRead)
58+
.then(validateLargeRead)
4559
.then(common.mustCall());

0 commit comments

Comments
 (0)