瀏覽代碼

LibRegex: Account for eof after \<x> when 'x' leads to legacy behaviour

Ali Mohammad Pur 2 年之前
父節點
當前提交
660d2b53b1
共有 2 個文件被更改,包括 2 次插入1 次删除
  1. 1 0
      Tests/LibRegex/Regex.cpp
  2. 1 1
      Userland/Libraries/LibRegex/RegexParser.cpp

+ 1 - 0
Tests/LibRegex/Regex.cpp

@@ -603,6 +603,7 @@ TEST_CASE(ECMA262_parse)
         { "(?<𝓑𝓻𝓸𝔀𝓷>a)"sv },
         { "((?=lg)?[vl]k\\-?\\d{3}) bui| 3\\.[-\\w; ]{10}lg?-([06cv9]{3,4})"sv, regex::Error::NoError, ECMAScriptFlags::BrowserExtended }, // #12373, quantifiable assertions.
         { parse_test_case_long_disjunction_chain.view() },                                                                                 // A whole lot of disjunctions, should not overflow the stack.
+        { "(\"|')(?:(?!\\2)[^\\\\\\r\\n]|\\\\.)*\\2"sv, regex::Error::NoError, ECMAScriptFlags::BrowserExtended },                         // LegacyOctalEscapeSequence should not consume too many chars (and should not crash)
     };
 
     for (auto& test : tests) {

+ 1 - 1
Userland/Libraries/LibRegex/RegexParser.cpp

@@ -1582,7 +1582,7 @@ bool ECMA262Parser::parse_atom_escape(ByteCode& stack, size_t& match_length_mini
         }
 
         // If not, put the characters back.
-        back(escape_str.length());
+        back(escape_str.length() + (done() ? 0 : 1));
     }
 
     Vector<CompareTypeAndValuePair> escape_compares;