mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 20:57:35 +00:00
AK: Fix StringView::find_last_of for one-character views
The find_last_of implementations were breaking out of the search loop too early for single-character string views. This caused a crash in CookieJar setting a cookie on google.com - CookieJar::default_path knew there was at least one "/" in a string view, but find_last_of returned nullopt, so dereferencing the optional caused a crash. Fixes #6273
This commit is contained in:
parent
d363ed8872
commit
3f4e90f32b
2 changed files with 12 additions and 6 deletions
|
@ -294,20 +294,20 @@ Optional<size_t> StringView::find_first_of(const StringView& view) const
|
||||||
|
|
||||||
Optional<size_t> StringView::find_last_of(char c) const
|
Optional<size_t> StringView::find_last_of(char c) const
|
||||||
{
|
{
|
||||||
for (size_t pos = m_length; --pos > 0;) {
|
for (size_t pos = m_length; pos != 0; --pos) {
|
||||||
if (m_characters[pos] == c)
|
if (m_characters[pos - 1] == c)
|
||||||
return pos;
|
return pos - 1;
|
||||||
}
|
}
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
Optional<size_t> StringView::find_last_of(const StringView& view) const
|
Optional<size_t> StringView::find_last_of(const StringView& view) const
|
||||||
{
|
{
|
||||||
for (size_t pos = m_length - 1; --pos > 0;) {
|
for (size_t pos = m_length; pos != 0; --pos) {
|
||||||
char c = m_characters[pos];
|
char c = m_characters[pos - 1];
|
||||||
for (char view_char : view) {
|
for (char view_char : view) {
|
||||||
if (c == view_char)
|
if (c == view_char)
|
||||||
return pos;
|
return pos - 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return {};
|
return {};
|
||||||
|
|
|
@ -164,6 +164,12 @@ TEST_CASE(find_last_of)
|
||||||
|
|
||||||
EXPECT_EQ(test_string_view.find_last_of('3').has_value(), false);
|
EXPECT_EQ(test_string_view.find_last_of('3').has_value(), false);
|
||||||
EXPECT_EQ(test_string_view.find_last_of("fghi").has_value(), false);
|
EXPECT_EQ(test_string_view.find_last_of("fghi").has_value(), false);
|
||||||
|
|
||||||
|
test_string_view = "/";
|
||||||
|
EXPECT_EQ(test_string_view.find_last_of('/').has_value(), true);
|
||||||
|
EXPECT_EQ(test_string_view.find_last_of('/').value(), 0U);
|
||||||
|
EXPECT_EQ(test_string_view.find_last_of("/").has_value(), true);
|
||||||
|
EXPECT_EQ(test_string_view.find_last_of("/").value(), 0U);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE(split_view)
|
TEST_CASE(split_view)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue