Skip to content

Commit 39cdcdc

Browse files
authored
Merge pull request #30 from zrax/find_scan_ub
Fix for find (and related operations) reading past the end of the string.
2 parents 80a3741 + 9486573 commit 39cdcdc

File tree

2 files changed

+14
-10
lines changed

2 files changed

+14
-10
lines changed

include/st_string_priv.h

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -122,12 +122,11 @@ namespace _ST_PRIVATE
122122
const char *ep = haystack + size;
123123
for ( ;; ) {
124124
cp = find_cs(cp, ep - cp, needle[0]);
125-
if (!cp)
125+
if (!cp || cp + needle_size > ep)
126126
return nullptr;
127127
if (compare_cs(cp, needle, needle_size) == 0)
128128
return cp;
129-
if (++cp + needle_size > ep)
130-
return nullptr;
129+
++cp;
131130
}
132131
}
133132

@@ -139,12 +138,11 @@ namespace _ST_PRIVATE
139138
const char *ep = haystack + size;
140139
for ( ;; ) {
141140
cp = find_ci(cp, ep - cp, needle[0]);
142-
if (!cp)
141+
if (!cp || cp + needle_size > ep)
143142
return nullptr;
144143
if (compare_ci(cp, needle, needle_size) == 0)
145144
return cp;
146-
if (++cp + needle_size > ep)
147-
return nullptr;
145+
++cp;
148146
}
149147
}
150148

test/test_string.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1774,17 +1774,23 @@ TEST(string, find_last)
17741774

17751775
// Starting position, case senstive
17761776
EXPECT_EQ(-1, ST_LITERAL("abcdABCD").find_last(4, "ABCD", ST::case_sensitive));
1777-
EXPECT_EQ( 4, ST_LITERAL("abcdABCDABCDabcd").find_last(5, "ABCD", ST::case_sensitive));
1777+
EXPECT_EQ(-1, ST_LITERAL("abcdABCDABCDabcd").find_last(5, "ABCD", ST::case_sensitive));
17781778
EXPECT_EQ( 4, ST_LITERAL("abcdABCDABCDabcd").find_last(8, "ABCD", ST::case_sensitive));
1779-
EXPECT_EQ( 8, ST_LITERAL("abcdABCDABCDabcd").find_last(9, "ABCD", ST::case_sensitive));
1779+
EXPECT_EQ( 4, ST_LITERAL("abcdABCDABCDabcd").find_last(9, "ABCD", ST::case_sensitive));
1780+
EXPECT_EQ( 4, ST_LITERAL("abcdABCDABCDabcd").find_last(11, "ABCD", ST::case_sensitive));
1781+
EXPECT_EQ( 8, ST_LITERAL("abcdABCDABCDabcd").find_last(12, "ABCD", ST::case_sensitive));
1782+
EXPECT_EQ( 8, ST_LITERAL("abcdABCDABCDabcd").find_last(100, "ABCD", ST::case_sensitive));
17801783
EXPECT_EQ(-1, ST_LITERAL("abcdABCDabcd").find_last(4, "ABCD", ST::case_sensitive));
17811784
EXPECT_EQ(-1, ST_LITERAL("ABCDabcd").find_last(0, "ABCD", ST::case_sensitive));
17821785

17831786
// Starting position, case insenstive
17841787
EXPECT_EQ(-1, ST_LITERAL("xxxxabcd").find_last(4, "ABCD", ST::case_insensitive));
1785-
EXPECT_EQ( 4, ST_LITERAL("xxxxabcdabcdxxxx").find_last(5, "ABCD", ST::case_insensitive));
1788+
EXPECT_EQ(-1, ST_LITERAL("xxxxabcdabcdxxxx").find_last(5, "ABCD", ST::case_insensitive));
17861789
EXPECT_EQ( 4, ST_LITERAL("xxxxabcdabcdxxxx").find_last(8, "ABCD", ST::case_insensitive));
1787-
EXPECT_EQ( 8, ST_LITERAL("xxxxabcdabcdxxxx").find_last(9, "ABCD", ST::case_insensitive));
1790+
EXPECT_EQ( 4, ST_LITERAL("xxxxabcdabcdxxxx").find_last(9, "ABCD", ST::case_insensitive));
1791+
EXPECT_EQ( 4, ST_LITERAL("xxxxabcdabcdxxxx").find_last(11, "ABCD", ST::case_insensitive));
1792+
EXPECT_EQ( 8, ST_LITERAL("xxxxabcdabcdxxxx").find_last(12, "ABCD", ST::case_insensitive));
1793+
EXPECT_EQ( 8, ST_LITERAL("xxxxabcdabcdxxxx").find_last(100, "ABCD", ST::case_insensitive));
17881794
EXPECT_EQ(-1, ST_LITERAL("xxxxabcdxxxx").find_last(4, "ABCD", ST::case_insensitive));
17891795
EXPECT_EQ(-1, ST_LITERAL("abcdxxxx").find_last(0, "ABCD", ST::case_insensitive));
17901796

0 commit comments

Comments
 (0)