summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/intl/grapheme/grapheme_util.h2
-rw-r--r--ext/intl/tests/grapheme2.phpt2
-rw-r--r--ext/intl/tests/grapheme_out_of_bounds.phpt95
3 files changed, 97 insertions, 2 deletions
diff --git a/ext/intl/grapheme/grapheme_util.h b/ext/intl/grapheme/grapheme_util.h
index 508b7355f0..6aeeed2bd7 100644
--- a/ext/intl/grapheme/grapheme_util.h
+++ b/ext/intl/grapheme/grapheme_util.h
@@ -37,6 +37,6 @@ int32_t grapheme_get_haystack_offset(UBreakIterator* bi, int32_t offset);
UBreakIterator* grapheme_get_break_iterator(void *stack_buffer, UErrorCode *status );
/* OUTSIDE_STRING: check if (possibly negative) long offset is outside the string with int32_t length */
-#define OUTSIDE_STRING(offset, max_len) ( offset <= INT32_MIN || offset > INT32_MAX || (offset < 0 ? -offset > (zend_long) max_len : offset >= (zend_long) max_len) )
+#define OUTSIDE_STRING(offset, max_len) ( offset <= INT32_MIN || offset > INT32_MAX || (offset < 0 ? -offset > (zend_long) max_len : offset > (zend_long) max_len) )
#endif // GRAPHEME_GRAPHEME_UTIL_H
diff --git a/ext/intl/tests/grapheme2.phpt b/ext/intl/tests/grapheme2.phpt
index 90af00732f..1335fcb04d 100644
--- a/ext/intl/tests/grapheme2.phpt
+++ b/ext/intl/tests/grapheme2.phpt
@@ -961,7 +961,7 @@ find "a%CC%8ABca%CC%8A" in "o%CC%88a%CC%8AaA%CC%8AbCa%CC%8Adef" - grapheme_strri
function grapheme_substr($string, $start, $length = -1) {}
-substring of "abc" from "3" - grapheme_substr: grapheme_substr(): Argument #2 ($start) must be contained in argument #1 ($string)
+substring of "abc" from "3" - grapheme_substr = false == false
substring of "aa%CC%8Abco%CC%88" from "5" - grapheme_substr = false == false
substring of "aoa%CC%8Abco%CC%88O" from "2" - grapheme_substr = a%CC%8Abco%CC%88O == a%CC%8Abco%CC%88O
substring of "o%CC%88a%CC%8AaA%CC%8Abc" from "2" - grapheme_substr = aA%CC%8Abc == aA%CC%8Abc
diff --git a/ext/intl/tests/grapheme_out_of_bounds.phpt b/ext/intl/tests/grapheme_out_of_bounds.phpt
new file mode 100644
index 0000000000..ab7a575e21
--- /dev/null
+++ b/ext/intl/tests/grapheme_out_of_bounds.phpt
@@ -0,0 +1,95 @@
+--TEST--
+grapheme_* functions with out-of-bounds offsets
+--FILE--
+<?php
+
+// Offset == Length is legal.
+var_dump(grapheme_strpos("foo", "bar", 3));
+var_dump(grapheme_stripos("foo", "bar", 3));
+var_dump(grapheme_strrpos("foo", "bar", 3));
+var_dump(grapheme_strripos("foo", "bar", 3));
+echo "\n";
+
+// Offset == -Length is legal.
+var_dump(grapheme_strpos("foo", "bar", -3));
+var_dump(grapheme_stripos("foo", "bar", -3));
+var_dump(grapheme_strrpos("foo", "bar", -3));
+var_dump(grapheme_strripos("foo", "bar", -3));
+echo "\n";
+
+// Positive out of bounds.
+try {
+ var_dump(grapheme_strpos("foo", "bar", 4));
+} catch (ValueError $e) {
+ echo $e->getMessage(), "\n";
+}
+try {
+ var_dump(grapheme_stripos("foo", "bar", 4));
+} catch (ValueError $e) {
+ echo $e->getMessage(), "\n";
+}
+try {
+ var_dump(grapheme_strrpos("foo", "bar", 4));
+} catch (ValueError $e) {
+ echo $e->getMessage(), "\n";
+}
+try {
+ var_dump(grapheme_strripos("foo", "bar", 4));
+} catch (ValueError $e) {
+ echo $e->getMessage(), "\n";
+}
+echo "\n";
+
+// Negative out of bounds.
+try {
+ var_dump(grapheme_strpos("foo", "bar", -4));
+} catch (ValueError $e) {
+ echo $e->getMessage(), "\n";
+}
+try {
+ var_dump(grapheme_stripos("foo", "bar", -4));
+} catch (ValueError $e) {
+ echo $e->getMessage(), "\n";
+}
+try {
+ var_dump(grapheme_strrpos("foo", "bar", -4));
+} catch (ValueError $e) {
+ echo $e->getMessage(), "\n";
+}
+try {
+ var_dump(grapheme_strripos("foo", "bar", -4));
+} catch (ValueError $e) {
+ echo $e->getMessage(), "\n";
+}
+echo "\n";
+
+// TODO: substr is special.
+var_dump(grapheme_substr("foo", 3));
+var_dump(grapheme_substr("foo", -3));
+//var_dump(grapheme_substr("foo", 4));
+//var_dump(grapheme_substr("foo", -4));
+
+?>
+--EXPECT--
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+
+grapheme_strpos(): Argument #3 ($offset) must be contained in argument #1 ($haystack)
+grapheme_stripos(): Argument #3 ($offset) must be contained in argument #1 ($haystack)
+grapheme_strrpos(): Argument #3 ($offset) must be contained in argument #1 ($haystack)
+grapheme_strripos(): Argument #3 ($offset) must be contained in argument #1 ($haystack)
+
+grapheme_strpos(): Argument #3 ($offset) must be contained in argument #1 ($haystack)
+grapheme_stripos(): Argument #3 ($offset) must be contained in argument #1 ($haystack)
+grapheme_strrpos(): Argument #3 ($offset) must be contained in argument #1 ($haystack)
+grapheme_strripos(): Argument #3 ($offset) must be contained in argument #1 ($haystack)
+
+bool(false)
+string(3) "foo"