summaryrefslogtreecommitdiff
path: root/Userland
diff options
context:
space:
mode:
authorAli Mohammad Pur <ali.mpfard@gmail.com>2021-08-30 23:24:46 +0430
committerAndreas Kling <kling@serenityos.org>2021-08-31 16:37:49 +0200
commit05c65f9b5d80d93277ac15a7ec4161a3aad18415 (patch)
tree141e2400f9b3708313ba3f10b261d62a49dde9c6 /Userland
parentc171aa40a8672930334a31fdfb15e9215d281e45 (diff)
downloadserenity-05c65f9b5d80d93277ac15a7ec4161a3aad18415.zip
LibRegex: Limit the number of nested capture groups allowed in BRE
Found by OSS-Fuzz: https://oss-fuzz.com/testcase?key=4869334212673536
Diffstat (limited to 'Userland')
-rw-r--r--Userland/Libraries/LibRegex/RegexParser.cpp6
-rw-r--r--Userland/Libraries/LibRegex/RegexParser.h1
2 files changed, 7 insertions, 0 deletions
diff --git a/Userland/Libraries/LibRegex/RegexParser.cpp b/Userland/Libraries/LibRegex/RegexParser.cpp
index 6e7f4eba8d..343eb7a553 100644
--- a/Userland/Libraries/LibRegex/RegexParser.cpp
+++ b/Userland/Libraries/LibRegex/RegexParser.cpp
@@ -12,6 +12,7 @@
#include <AK/String.h>
#include <AK/StringBuilder.h>
#include <AK/StringUtils.h>
+#include <AK/TemporaryChange.h>
#include <AK/Utf16View.h>
#include <LibUnicode/CharacterTypes.h>
@@ -460,6 +461,11 @@ bool PosixBasicParser::parse_nonduplicating_re(ByteCode& bytecode, size_t& match
{
// nondupl_RE : one_char_or_coll_elem_RE | Back_open_paren RE_expression Back_close_paren | BACKREF
if (try_skip("\\(")) {
+ TemporaryChange change { m_current_capture_group_depth, m_current_capture_group_depth + 1 };
+ // Max number of addressable capture groups is 10, let's just be lenient
+ // and accept 20; anything past that is probably a silly pattern anyway.
+ if (m_current_capture_group_depth > 20)
+ return set_error(Error::InvalidPattern);
ByteCode capture_bytecode;
size_t capture_length_minimum = 0;
auto capture_group_index = ++m_parser_state.capture_groups_count;
diff --git a/Userland/Libraries/LibRegex/RegexParser.h b/Userland/Libraries/LibRegex/RegexParser.h
index 33bccca223..cc73fa8665 100644
--- a/Userland/Libraries/LibRegex/RegexParser.h
+++ b/Userland/Libraries/LibRegex/RegexParser.h
@@ -166,6 +166,7 @@ private:
constexpr static size_t number_of_addressable_capture_groups = 9;
size_t m_capture_group_minimum_lengths[number_of_addressable_capture_groups] { 0 };
bool m_capture_group_seen[number_of_addressable_capture_groups] { false };
+ size_t m_current_capture_group_depth { 0 };
};
class PosixExtendedParser final : public AbstractPosixParser {