summaryrefslogtreecommitdiff
path: root/AK
diff options
context:
space:
mode:
authorSam Atkins <atkinssj@serenityos.org>2022-03-18 18:02:07 +0000
committerLinus Groh <mail@linusgroh.de>2022-03-18 23:51:56 +0000
commit7e98c8eaf66698fb28a8c3ac825559ce380c1624 (patch)
tree3d5deece68042fff9e2369c3808002c32e3aff6c /AK
parent00eca260858ee9a9327476409a89ff03499c3b8a (diff)
downloadserenity-7e98c8eaf66698fb28a8c3ac825559ce380c1624.zip
AK+Tests: Fix StringUtils::contains() being confused by repeating text
Previously, case-insensitively searching the haystack "Go Go Back" for the needle "Go Back" would return false: 1. Match the first three characters. "Go ". 2. Notice that 'G' and 'B' don't match. 3. Skip ahead 3 characters, plus 1 for the outer for-loop. 4. Now, the haystack is effectively "o Back", so the match fails. Reducing the skip by 1 fixes this issue. I'm not 100% convinced this fixes all cases, but I haven't been able to find any cases where it doesn't work now. :^)
Diffstat (limited to 'AK')
-rw-r--r--AK/StringUtils.cpp3
1 files changed, 2 insertions, 1 deletions
diff --git a/AK/StringUtils.cpp b/AK/StringUtils.cpp
index cc73f203ae..927b3b6ee1 100644
--- a/AK/StringUtils.cpp
+++ b/AK/StringUtils.cpp
@@ -305,7 +305,8 @@ bool contains(StringView str, StringView needle, CaseSensitivity case_sensitivit
continue;
for (size_t ni = 0; si + ni < str.length(); ni++) {
if (to_ascii_lowercase(str_chars[si + ni]) != to_ascii_lowercase(needle_chars[ni])) {
- si += ni;
+ if (ni > 0)
+ si += ni - 1;
break;
}
if (ni + 1 == needle.length())