Skip to content

Commit 402a02f

Browse files
authored
assert: cap input size in myersDiff to avoid Int32Array overflow
PR-URL: #59578 Reviewed-By: James M Snell <[email protected]> Reviewed-By: Ruben Bridgewater <[email protected]>
1 parent 670d7ab commit 402a02f

File tree

2 files changed

+40
-1
lines changed

2 files changed

+40
-1
lines changed

lib/internal/assert/myers_diff.js

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@ const {
66
StringPrototypeEndsWith,
77
} = primordials;
88

9+
const {
10+
codes: {
11+
ERR_OUT_OF_RANGE,
12+
},
13+
} = require('internal/errors');
14+
915
const colors = require('internal/util/colors');
1016

1117
const kNopLinesToCollapse = 5;
@@ -29,7 +35,15 @@ function myersDiff(actual, expected, checkCommaDisparity = false) {
2935
const actualLength = actual.length;
3036
const expectedLength = expected.length;
3137
const max = actualLength + expectedLength;
32-
// TODO(BridgeAR): Cap the input in case the values go beyond the limit of 2^31 - 1.
38+
39+
if (max > 2 ** 31 - 1) {
40+
throw new ERR_OUT_OF_RANGE(
41+
'myersDiff input size',
42+
'< 2^31',
43+
max,
44+
);
45+
}
46+
3347
const v = new Int32Array(2 * max + 1);
3448
const trace = [];
3549

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// Flags: --expose-internals
2+
'use strict';
3+
4+
const common = require('../common');
5+
const assert = require('assert');
6+
7+
const { myersDiff } = require('internal/assert/myers_diff');
8+
9+
{
10+
const arr1 = { length: 2 ** 31 - 1 };
11+
const arr2 = { length: 2 };
12+
const max = arr1.length + arr2.length;
13+
assert.throws(
14+
() => {
15+
myersDiff(arr1, arr2);
16+
},
17+
common.expectsError({
18+
code: 'ERR_OUT_OF_RANGE',
19+
name: 'RangeError',
20+
message: 'The value of "myersDiff input size" ' +
21+
'is out of range. It must be < 2^31. ' +
22+
`Received ${max}`
23+
})
24+
);
25+
}

0 commit comments

Comments
 (0)