diff --git a/Tests/LibRegex/Regex.cpp b/Tests/LibRegex/Regex.cpp index 5f87ebff7a7..1716462c067 100644 --- a/Tests/LibRegex/Regex.cpp +++ b/Tests/LibRegex/Regex.cpp @@ -591,6 +591,8 @@ TEST_CASE(ECMA262_parse) { "a{9007199254740991,9007199254740992}"sv, regex::Error::InvalidBraceContent }, { "a{9007199254740992,9007199254740991}"sv, regex::Error::InvalidBraceContent }, { "a{9007199254740992,9007199254740992}"sv, regex::Error::InvalidBraceContent }, + { "(?a)(?b)"sv, regex::Error::DuplicateNamedCapture }, + { "(?a)(?b)(?c)"sv, regex::Error::DuplicateNamedCapture }, }; for (auto& test : tests) { diff --git a/Userland/Libraries/LibC/regex.h b/Userland/Libraries/LibC/regex.h index 679db8671f3..3697286de68 100644 --- a/Userland/Libraries/LibC/regex.h +++ b/Userland/Libraries/LibC/regex.h @@ -38,6 +38,7 @@ enum __Regex_Error { __Regex_InvalidCaptureGroup, // Content of capture group is invalid. __Regex_InvalidNameForCaptureGroup, // Name of capture group is invalid. __Regex_InvalidNameForProperty, // Name of property is invalid. + __Regex_DuplicateNamedCapture, // Duplicate named capture group }; enum ReError { diff --git a/Userland/Libraries/LibRegex/RegexError.h b/Userland/Libraries/LibRegex/RegexError.h index 5a4428c93fd..33dc11ae9fb 100644 --- a/Userland/Libraries/LibRegex/RegexError.h +++ b/Userland/Libraries/LibRegex/RegexError.h @@ -35,6 +35,7 @@ enum class Error : u8 { InvalidCaptureGroup = __Regex_InvalidCaptureGroup, // Content of capture group is invalid. InvalidNameForCaptureGroup = __Regex_InvalidNameForCaptureGroup, // Name of capture group is invalid. InvalidNameForProperty = __Regex_InvalidNameForProperty, // Name of property is invalid. + DuplicateNamedCapture = __Regex_DuplicateNamedCapture, // Name of property is invalid. }; inline String get_error_string(Error error) @@ -76,6 +77,8 @@ inline String get_error_string(Error error) return "Name of capture group is invalid."; case Error::InvalidNameForProperty: return "Name of property is invalid."; + case Error::DuplicateNamedCapture: + return "Duplicate capture group name"; } return "Undefined error."; } diff --git a/Userland/Libraries/LibRegex/RegexParser.cpp b/Userland/Libraries/LibRegex/RegexParser.cpp index 91c42e5173a..3642c93b48e 100644 --- a/Userland/Libraries/LibRegex/RegexParser.cpp +++ b/Userland/Libraries/LibRegex/RegexParser.cpp @@ -2166,6 +2166,11 @@ bool ECMA262Parser::parse_capture_group(ByteCode& stack, size_t& match_length_mi return false; } + if (m_parser_state.named_capture_groups.contains(name)) { + set_error(Error::DuplicateNamedCapture); + return false; + } + ByteCode capture_group_bytecode; size_t length = 0; enter_capture_group_scope();