diff --git a/common.gypi b/common.gypi index d421eefd6b03ad..cddedd639adc0d 100644 --- a/common.gypi +++ b/common.gypi @@ -36,7 +36,7 @@ # Reset this number to 0 on major V8 upgrades. # Increment by one for each non-official patch applied to deps/v8. - 'v8_embedder_string': '-node.46', + 'v8_embedder_string': '-node.47', ##### V8 defaults for Node.js ##### diff --git a/deps/v8/src/regexp/regexp-compiler.cc b/deps/v8/src/regexp/regexp-compiler.cc index a04180fd346d7f..5e1b70ef7334a3 100644 --- a/deps/v8/src/regexp/regexp-compiler.cc +++ b/deps/v8/src/regexp/regexp-compiler.cc @@ -2536,7 +2536,16 @@ int ChoiceNode::GreedyLoopTextLengthForAlternative( SeqRegExpNode* seq_node = static_cast(node); node = seq_node->on_success(); } - return read_backward() ? -length : length; + if (read_backward()) { + length = -length; + } + // Check that we can jump by the whole text length. If not, return sentinel + // to indicate the we can't construct a greedy loop. + if (length < RegExpMacroAssembler::kMinCPOffset || + length > RegExpMacroAssembler::kMaxCPOffset) { + return kNodeIsTooComplexForGreedyLoops; + } + return length; } void LoopChoiceNode::AddLoopAlternative(GuardedAlternative alt) { diff --git a/deps/v8/test/mjsunit/regress/regress-1166138.js b/deps/v8/test/mjsunit/regress/regress-1166138.js index b1a5d6b7bb8651..f3e4bde83e2769 100644 --- a/deps/v8/test/mjsunit/regress/regress-1166138.js +++ b/deps/v8/test/mjsunit/regress/regress-1166138.js @@ -4,4 +4,4 @@ let badregexp = "(?:" + " ".repeat(32768*2)+ ")*"; reg = RegExp(badregexp); -reg.test() +assertThrows(() => reg.test(), SyntaxError);