From 9b2f0613ef00292cefec6caa8d2c8bb21dab2539 Mon Sep 17 00:00:00 2001 From: Ali Mohammad Pur Date: Wed, 1 Sep 2021 03:09:10 +0430 Subject: [PATCH] LibRegex: Correctly advance string positions in Compare::compare_string Fixes a bug where backreferences could cause desync between the code point index and regular index, making comparison off-by-N. --- Userland/Libraries/LibRegex/RegexByteCode.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Userland/Libraries/LibRegex/RegexByteCode.cpp b/Userland/Libraries/LibRegex/RegexByteCode.cpp index 9e1c7b2251..52b70bb64a 100644 --- a/Userland/Libraries/LibRegex/RegexByteCode.cpp +++ b/Userland/Libraries/LibRegex/RegexByteCode.cpp @@ -102,6 +102,12 @@ static void advance_string_position(MatchState& state, RegexStringView const& vi } } +static void advance_string_position(MatchState& state, RegexStringView const&, RegexStringView const& advance_by) +{ + state.string_position += advance_by.length(); + state.string_position_in_code_units += advance_by.length_in_code_units(); +} + static void reverse_string_position(MatchState& state, RegexStringView const& view, size_t amount) { VERIFY(state.string_position >= amount); @@ -606,7 +612,7 @@ ALWAYS_INLINE bool OpCode_Compare::compare_string(MatchInput const& input, Match equals = subject.equals(str); if (equals) - state.string_position += str.length(); + advance_string_position(state, input.view, str); return equals; }