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:
parent
c9d9bf1cb0
commit
5012587b1a
@ -31,7 +31,6 @@ const {
|
|||||||
validatePath
|
validatePath
|
||||||
} = require('internal/fs/utils');
|
} = require('internal/fs/utils');
|
||||||
const {
|
const {
|
||||||
isUint32,
|
|
||||||
validateMode,
|
validateMode,
|
||||||
validateInteger,
|
validateInteger,
|
||||||
validateUint32
|
validateUint32
|
||||||
@ -211,7 +210,7 @@ async function read(handle, buffer, offset, length, position) {
|
|||||||
|
|
||||||
validateOffsetLengthRead(offset, length, buffer.length);
|
validateOffsetLengthRead(offset, length, buffer.length);
|
||||||
|
|
||||||
if (!isUint32(position))
|
if (!Number.isSafeInteger(position))
|
||||||
position = -1;
|
position = -1;
|
||||||
|
|
||||||
const bytesRead = (await binding.read(handle.fd, buffer, offset, length,
|
const bytesRead = (await binding.read(handle.fd, buffer, offset, length,
|
||||||
|
@ -8,6 +8,7 @@ const common = require('../common');
|
|||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const { open } = fs.promises;
|
const { open } = fs.promises;
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
|
const fixtures = require('../common/fixtures');
|
||||||
const tmpdir = require('../common/tmpdir');
|
const tmpdir = require('../common/tmpdir');
|
||||||
const assert = require('assert');
|
const assert = require('assert');
|
||||||
const tmpDir = tmpdir.path;
|
const tmpDir = tmpdir.path;
|
||||||
@ -40,6 +41,19 @@ async function validateEmptyRead() {
|
|||||||
assert.deepStrictEqual(buffer.length, readAsyncHandle.bytesRead);
|
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()
|
validateRead()
|
||||||
.then(validateEmptyRead)
|
.then(validateEmptyRead)
|
||||||
|
.then(validateLargeRead)
|
||||||
.then(common.mustCall());
|
.then(common.mustCall());
|
||||||
|
Loading…
x
Reference in New Issue
Block a user