fs: fix promises reads with pos > 4GB

PR-URL: https://github.com/nodejs/node/pull/21148
Fixes: https://github.com/nodejs/node/issues/21121
Refs: https://github.com/nodejs/node/pull/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>
This commit is contained in:
cjihrig 2018-06-05 09:12:19 -04:00
parent c9d9bf1cb0
commit 5012587b1a
No known key found for this signature in database
GPG Key ID: 7434390BDBE9B9C5
2 changed files with 15 additions and 2 deletions

View File

@ -31,7 +31,6 @@ const {
validatePath
} = require('internal/fs/utils');
const {
isUint32,
validateMode,
validateInteger,
validateUint32
@ -211,7 +210,7 @@ async function read(handle, buffer, offset, length, position) {
validateOffsetLengthRead(offset, length, buffer.length);
if (!isUint32(position))
if (!Number.isSafeInteger(position))
position = -1;
const bytesRead = (await binding.read(handle.fd, buffer, offset, length,

View File

@ -8,6 +8,7 @@ const common = require('../common');
const fs = require('fs');
const { open } = fs.promises;
const path = require('path');
const fixtures = require('../common/fixtures');
const tmpdir = require('../common/tmpdir');
const assert = require('assert');
const tmpDir = tmpdir.path;
@ -40,6 +41,19 @@ async function validateEmptyRead() {
assert.deepStrictEqual(buffer.length, readAsyncHandle.bytesRead);
}
async function validateLargeRead() {
// Reading beyond file length (3 in this case) should return no data.
// This is a test for a bug where reads > uint32 would return data
// from the current position in the file.
const filePath = fixtures.path('x.txt');
const fileHandle = await open(filePath, 'r');
const pos = 0xffffffff + 1; // max-uint32 + 1
const readHandle = await fileHandle.read(Buffer.alloc(1), 0, 1, pos);
assert.strictEqual(readHandle.bytesRead, 0);
}
validateRead()
.then(validateEmptyRead)
.then(validateLargeRead)
.then(common.mustCall());