mirror of
https://github.com/nodejs/node.git
synced 2025-05-03 15:17:17 +00:00

Since the lineEnding Regular Expression is declared on the module scope, recursive invocations of its `[kTtyWrite]` method share one instance of this Regular Expression. Since the state of a RegExp is managed by instance, alternately calling RegExpPrototypeExec with the same RegExp on different strings can lead to the state changing unexpectedly. This is the root cause of this infinite loop bug when calling .load on javascript files of certain shapes. PR-URL: https://github.com/nodejs/node/pull/46742 Fixes: https://github.com/nodejs/node/issues/46731 Reviewed-By: Kohei Ueno <kohei.ueno119@gmail.com> Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
34 lines
742 B
JavaScript
34 lines
742 B
JavaScript
'use strict';
|
|
const common = require('../common');
|
|
const ArrayStream = require('../common/arraystream');
|
|
const assert = require('assert');
|
|
|
|
common.skipIfDumbTerminal();
|
|
|
|
const readline = require('readline');
|
|
const rli = new readline.Interface({
|
|
terminal: true,
|
|
input: new ArrayStream(),
|
|
});
|
|
|
|
let recursionDepth = 0;
|
|
|
|
// Minimal reproduction for #46731
|
|
const testInput = ' \n}\n';
|
|
const numberOfExpectedLines = testInput.match(/\n/g).length;
|
|
|
|
rli.on('line', () => {
|
|
// Abort in case of infinite loop
|
|
if (recursionDepth > numberOfExpectedLines) {
|
|
return;
|
|
}
|
|
recursionDepth++;
|
|
// Write something recursively to readline
|
|
rli.write('foo');
|
|
});
|
|
|
|
|
|
rli.write(testInput);
|
|
|
|
assert.strictEqual(recursionDepth, numberOfExpectedLines);
|