From 1c584e9d801632f28b43da490656a8123b549f50 Mon Sep 17 00:00:00 2001 From: Ali Mohammad Pur Date: Sat, 10 Jul 2021 22:02:18 +0430 Subject: [PATCH] LibRegex: Correctly parse BRE bracket expressions Commonly, bracket expressions are in fact, enclosed in brackets. --- Tests/LibRegex/RegexLibC.cpp | 6 ++++++ Userland/Libraries/LibRegex/RegexParser.cpp | 18 +++++++++++++----- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/Tests/LibRegex/RegexLibC.cpp b/Tests/LibRegex/RegexLibC.cpp index e922e4525e..04794dbc08 100644 --- a/Tests/LibRegex/RegexLibC.cpp +++ b/Tests/LibRegex/RegexLibC.cpp @@ -1149,4 +1149,10 @@ TEST_CASE(bre_basic) EXPECT_EQ(regcomp(®ex, "15{1,2}", REG_NOSUB | REG_ICASE), REG_NOERR); EXPECT_EQ(regexec(®ex, "15{1,2}", 0, NULL, 0), REG_NOERR); regfree(®ex); + + EXPECT_EQ(regcomp(®ex, "1[56]", REG_NOSUB | REG_ICASE), REG_NOERR); + EXPECT_EQ(regexec(®ex, "15", 0, NULL, 0), REG_NOERR); + EXPECT_EQ(regexec(®ex, "16", 0, NULL, 0), REG_NOERR); + EXPECT_EQ(regexec(®ex, "17", 0, NULL, 0), REG_NOMATCH); + regfree(®ex); } diff --git a/Userland/Libraries/LibRegex/RegexParser.cpp b/Userland/Libraries/LibRegex/RegexParser.cpp index d794721d94..814759de4e 100644 --- a/Userland/Libraries/LibRegex/RegexParser.cpp +++ b/Userland/Libraries/LibRegex/RegexParser.cpp @@ -481,12 +481,20 @@ bool PosixBasicParser::parse_one_char_or_collation_element(ByteCode& bytecode, s Vector values; size_t bracket_minimum_length = 0; - if (!AbstractPosixParser::parse_bracket_expression(values, bracket_minimum_length)) - return false; - bytecode.insert_bytecode_compare_values(move(values)); - match_length_minimum += bracket_minimum_length; - return !has_error(); + if (match(TokenType::LeftBracket)) { + consume(); + if (!AbstractPosixParser::parse_bracket_expression(values, bracket_minimum_length)) + return false; + + consume(TokenType::RightBracket, Error::MismatchingBracket); + + bytecode.insert_bytecode_compare_values(move(values)); + match_length_minimum += bracket_minimum_length; + return !has_error(); + } + + return set_error(Error::InvalidPattern); } // =============================