]> granicus.if.org Git - php/commitdiff
Fix grapheme out of bounds check
authorNikita Popov <nikita.ppv@gmail.com>
Tue, 22 Sep 2020 14:35:53 +0000 (16:35 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Tue, 22 Sep 2020 14:38:53 +0000 (16:38 +0200)
An offset equal to the string length is not out of bounds.

ext/intl/grapheme/grapheme_util.h
ext/intl/tests/grapheme2.phpt
ext/intl/tests/grapheme_out_of_bounds.phpt [new file with mode: 0644]

index 508b7355f02172b9ff15b4996050f96ff6930a6d..6aeeed2bd798ef9fa43e9073f59a63273b22302c 100644 (file)
@@ -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
index 90af00732fa7f1a294d18c65f0997c67cc8baa1a..1335fcb04dd6e54887e164f5d6b04f234d35b3b9 100644 (file)
@@ -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 (file)
index 0000000..ab7a575
--- /dev/null
@@ -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"