Sfoglia il codice sorgente

LibRegex: Allow '-' as the last element of a charclass

Fixes #4189.
AnotherTest 4 anni fa
parent
commit
491e4a8a3b
2 ha cambiato i file con 12 aggiunte e 0 eliminazioni
  1. 8 0
      Libraries/LibRegex/RegexParser.cpp
  2. 4 0
      Libraries/LibRegex/Tests/Regex.cpp

+ 8 - 0
Libraries/LibRegex/RegexParser.cpp

@@ -1315,6 +1315,12 @@ bool ECMA262Parser::parse_nonempty_class_ranges(Vector<CompareTypeAndValuePair>&
 
         if (match(TokenType::HyphenMinus)) {
             consume();
+            if (match(TokenType::RightBracket)) {
+                //  Allow '-' as the last element in a charclass, even after an atom.
+                m_parser_state.lexer.back(2); // -]
+                m_parser_state.current_token = m_parser_state.lexer.next();
+                goto read_as_single_atom;
+            }
             auto second_atom = read_class_atom();
             if (!second_atom.has_value())
                 return false;
@@ -1336,6 +1342,8 @@ bool ECMA262Parser::parse_nonempty_class_ranges(Vector<CompareTypeAndValuePair>&
             continue;
         }
 
+    read_as_single_atom:;
+
         auto atom = first_atom.value();
 
         if (atom.is_character_class) {

+ 4 - 0
Libraries/LibRegex/Tests/Regex.cpp

@@ -485,6 +485,10 @@ TEST_CASE(ECMA262_parse)
         "^hel(?<LO>l\\w).$",
         "^[-a-zA-Z\\w\\s]+$",
         "\\bhello\\B",
+        "^[\\w+/_-]+[=]{0,2}$",                        // #4189
+        "^(?:[^<]*(<[\\w\\W]+>)[^>]*$|#([\\w\\-]*)$)", // #4189
+        "\\/",                                         // #4189
+        "\\x",                                         // Even invalid escapes are allowed if ~unicode.
     };
 
     for (auto& pattern : patterns) {