mirror of
https://github.com/nodejs/node.git
synced 2025-04-28 13:40:37 +00:00

This prohibits invalid values (< -1 and non-integers) and allows `filehandle.read()` to handle position up to `2n ** 63n - 1n` PR-URL: https://github.com/nodejs/node/pull/42835 Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
80 lines
2.2 KiB
JavaScript
80 lines
2.2 KiB
JavaScript
import * as common from '../common/index.mjs';
|
|
import * as fixtures from '../common/fixtures.mjs';
|
|
import fs from 'fs';
|
|
import assert from 'assert';
|
|
|
|
// This test ensures that "position" argument is correctly validated
|
|
|
|
const filepath = fixtures.path('x.txt');
|
|
|
|
const buffer = Buffer.from('xyz\n');
|
|
const offset = 0;
|
|
const length = buffer.byteLength;
|
|
|
|
// allowedErrors is an array of acceptable internal errors
|
|
// For example, on some platforms read syscall might return -EFBIG or -EOVERFLOW
|
|
function testValid(position, allowedErrors = []) {
|
|
let fdSync;
|
|
try {
|
|
fdSync = fs.openSync(filepath, 'r');
|
|
fs.readSync(fdSync, buffer, offset, length, position);
|
|
fs.readSync(fdSync, buffer, common.mustNotMutateObjectDeep({ offset, length, position }));
|
|
} catch (err) {
|
|
if (!allowedErrors.includes(err.code)) {
|
|
assert.fail(err);
|
|
}
|
|
} finally {
|
|
if (fdSync) fs.closeSync(fdSync);
|
|
}
|
|
}
|
|
|
|
function testInvalid(code, position) {
|
|
let fdSync;
|
|
try {
|
|
fdSync = fs.openSync(filepath, 'r');
|
|
assert.throws(
|
|
() => fs.readSync(fdSync, buffer, offset, length, position),
|
|
{ code }
|
|
);
|
|
assert.throws(
|
|
() => fs.readSync(fdSync, buffer, common.mustNotMutateObjectDeep({ offset, length, position })),
|
|
{ code }
|
|
);
|
|
} finally {
|
|
if (fdSync) fs.closeSync(fdSync);
|
|
}
|
|
}
|
|
|
|
{
|
|
testValid(undefined);
|
|
testValid(null);
|
|
testValid(-1);
|
|
testValid(-1n);
|
|
|
|
testValid(0);
|
|
testValid(0n);
|
|
testValid(1);
|
|
testValid(1n);
|
|
testValid(9);
|
|
testValid(9n);
|
|
testValid(Number.MAX_SAFE_INTEGER, [ 'EFBIG', 'EOVERFLOW' ]);
|
|
|
|
testValid(2n ** 63n - 1n - BigInt(length), [ 'EFBIG', 'EOVERFLOW' ]);
|
|
testInvalid('ERR_OUT_OF_RANGE', 2n ** 63n);
|
|
testInvalid('ERR_OUT_OF_RANGE', 2n ** 63n - BigInt(length));
|
|
|
|
testInvalid('ERR_OUT_OF_RANGE', NaN);
|
|
testInvalid('ERR_OUT_OF_RANGE', -Infinity);
|
|
testInvalid('ERR_OUT_OF_RANGE', Infinity);
|
|
testInvalid('ERR_OUT_OF_RANGE', -0.999);
|
|
testInvalid('ERR_OUT_OF_RANGE', -(2n ** 64n));
|
|
testInvalid('ERR_OUT_OF_RANGE', Number.MAX_SAFE_INTEGER + 1);
|
|
testInvalid('ERR_OUT_OF_RANGE', Number.MAX_VALUE);
|
|
|
|
for (const badTypeValue of [
|
|
false, true, '1', Symbol(1), {}, [], () => {}, Promise.resolve(1),
|
|
]) {
|
|
testInvalid('ERR_INVALID_ARG_TYPE', badTypeValue);
|
|
}
|
|
}
|