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();