Skip to content

Commit 1312c41

Browse files
committed
Fix grapheme out of bounds check
An offset equal to the string length is not out of bounds.
1 parent 544dbe8 commit 1312c41

File tree

3 files changed

+97
-2
lines changed

3 files changed

+97
-2
lines changed

ext/intl/grapheme/grapheme_util.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,6 @@ int32_t grapheme_get_haystack_offset(UBreakIterator* bi, int32_t offset);
3737
UBreakIterator* grapheme_get_break_iterator(void *stack_buffer, UErrorCode *status );
3838

3939
/* OUTSIDE_STRING: check if (possibly negative) long offset is outside the string with int32_t length */
40-
#define OUTSIDE_STRING(offset, max_len) ( offset <= INT32_MIN || offset > INT32_MAX || (offset < 0 ? -offset > (zend_long) max_len : offset >= (zend_long) max_len) )
40+
#define OUTSIDE_STRING(offset, max_len) ( offset <= INT32_MIN || offset > INT32_MAX || (offset < 0 ? -offset > (zend_long) max_len : offset > (zend_long) max_len) )
4141

4242
#endif // GRAPHEME_GRAPHEME_UTIL_H

ext/intl/tests/grapheme2.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -961,7 +961,7 @@ find "a%CC%8ABca%CC%8A" in "o%CC%88a%CC%8AaA%CC%8AbCa%CC%8Adef" - grapheme_strri
961961

962962
function grapheme_substr($string, $start, $length = -1) {}
963963

964-
substring of "abc" from "3" - grapheme_substr: grapheme_substr(): Argument #2 ($start) must be contained in argument #1 ($string)
964+
substring of "abc" from "3" - grapheme_substr = false == false
965965
substring of "aa%CC%8Abco%CC%88" from "5" - grapheme_substr = false == false
966966
substring of "aoa%CC%8Abco%CC%88O" from "2" - grapheme_substr = a%CC%8Abco%CC%88O == a%CC%8Abco%CC%88O
967967
substring of "o%CC%88a%CC%8AaA%CC%8Abc" from "2" - grapheme_substr = aA%CC%8Abc == aA%CC%8Abc
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
--TEST--
2+
grapheme_* functions with out-of-bounds offsets
3+
--FILE--
4+
<?php
5+
6+
// Offset == Length is legal.
7+
var_dump(grapheme_strpos("foo", "bar", 3));
8+
var_dump(grapheme_stripos("foo", "bar", 3));
9+
var_dump(grapheme_strrpos("foo", "bar", 3));
10+
var_dump(grapheme_strripos("foo", "bar", 3));
11+
echo "\n";
12+
13+
// Offset == -Length is legal.
14+
var_dump(grapheme_strpos("foo", "bar", -3));
15+
var_dump(grapheme_stripos("foo", "bar", -3));
16+
var_dump(grapheme_strrpos("foo", "bar", -3));
17+
var_dump(grapheme_strripos("foo", "bar", -3));
18+
echo "\n";
19+
20+
// Positive out of bounds.
21+
try {
22+
var_dump(grapheme_strpos("foo", "bar", 4));
23+
} catch (ValueError $e) {
24+
echo $e->getMessage(), "\n";
25+
}
26+
try {
27+
var_dump(grapheme_stripos("foo", "bar", 4));
28+
} catch (ValueError $e) {
29+
echo $e->getMessage(), "\n";
30+
}
31+
try {
32+
var_dump(grapheme_strrpos("foo", "bar", 4));
33+
} catch (ValueError $e) {
34+
echo $e->getMessage(), "\n";
35+
}
36+
try {
37+
var_dump(grapheme_strripos("foo", "bar", 4));
38+
} catch (ValueError $e) {
39+
echo $e->getMessage(), "\n";
40+
}
41+
echo "\n";
42+
43+
// Negative out of bounds.
44+
try {
45+
var_dump(grapheme_strpos("foo", "bar", -4));
46+
} catch (ValueError $e) {
47+
echo $e->getMessage(), "\n";
48+
}
49+
try {
50+
var_dump(grapheme_stripos("foo", "bar", -4));
51+
} catch (ValueError $e) {
52+
echo $e->getMessage(), "\n";
53+
}
54+
try {
55+
var_dump(grapheme_strrpos("foo", "bar", -4));
56+
} catch (ValueError $e) {
57+
echo $e->getMessage(), "\n";
58+
}
59+
try {
60+
var_dump(grapheme_strripos("foo", "bar", -4));
61+
} catch (ValueError $e) {
62+
echo $e->getMessage(), "\n";
63+
}
64+
echo "\n";
65+
66+
// TODO: substr is special.
67+
var_dump(grapheme_substr("foo", 3));
68+
var_dump(grapheme_substr("foo", -3));
69+
//var_dump(grapheme_substr("foo", 4));
70+
//var_dump(grapheme_substr("foo", -4));
71+
72+
?>
73+
--EXPECT--
74+
bool(false)
75+
bool(false)
76+
bool(false)
77+
bool(false)
78+
79+
bool(false)
80+
bool(false)
81+
bool(false)
82+
bool(false)
83+
84+
grapheme_strpos(): Argument #3 ($offset) must be contained in argument #1 ($haystack)
85+
grapheme_stripos(): Argument #3 ($offset) must be contained in argument #1 ($haystack)
86+
grapheme_strrpos(): Argument #3 ($offset) must be contained in argument #1 ($haystack)
87+
grapheme_strripos(): Argument #3 ($offset) must be contained in argument #1 ($haystack)
88+
89+
grapheme_strpos(): Argument #3 ($offset) must be contained in argument #1 ($haystack)
90+
grapheme_stripos(): Argument #3 ($offset) must be contained in argument #1 ($haystack)
91+
grapheme_strrpos(): Argument #3 ($offset) must be contained in argument #1 ($haystack)
92+
grapheme_strripos(): Argument #3 ($offset) must be contained in argument #1 ($haystack)
93+
94+
bool(false)
95+
string(3) "foo"

0 commit comments

Comments
 (0)