summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/standard/string.c12
-rw-r--r--ext/standard/tests/strings/strrpos.phpt8
-rw-r--r--ext/standard/tests/strings/strrpos_negative_offset.phpt35
3 files changed, 41 insertions, 14 deletions
diff --git a/ext/standard/string.c b/ext/standard/string.c
index 58073044ca..f746a242fc 100644
--- a/ext/standard/string.c
+++ b/ext/standard/string.c
@@ -2050,10 +2050,10 @@ PHP_FUNCTION(strrpos)
RETURN_FALSE;
}
p = haystack->val;
- if (haystack->len + offset + 1 >= needle_len) {
- e = haystack->val + haystack->len + offset + needle_len;
- } else {
+ if (-offset < needle_len) {
e = haystack->val + haystack->len;
+ } else {
+ e = haystack->val + haystack->len + offset + needle_len;
}
}
@@ -2149,10 +2149,10 @@ PHP_FUNCTION(strripos)
RETURN_FALSE;
}
p = haystack_dup->val;
- if (haystack->len + offset + 1 >= needle->len) {
- e = haystack_dup->val + haystack->len + offset + needle->len;
- } else {
+ if (-offset < needle->len) {
e = haystack_dup->val + haystack->len;
+ } else {
+ e = haystack_dup->val + haystack->len + offset + needle->len;
}
}
diff --git a/ext/standard/tests/strings/strrpos.phpt b/ext/standard/tests/strings/strrpos.phpt
index 6b5ee09343..691f67e599 100644
--- a/ext/standard/tests/strings/strrpos.phpt
+++ b/ext/standard/tests/strings/strrpos.phpt
@@ -15,10 +15,6 @@ strrpos() function
var_dump(@strrpos("a", ""));
var_dump(@strrpos("", "a"));
var_dump(@strrpos("\\\\a", "\\a"));
- var_dump(strrpos("/documents/show/5474", '/', -20));
- var_dump(@strrpos("/documents/show/5474", '/d', -21));
- var_dump(strrpos("/documents/show/5474", 'd', -19));
- var_dump(strrpos("/documents/show/5474", '/d', -15));
?>
--EXPECT--
int(5)
@@ -34,7 +30,3 @@ bool(false)
bool(false)
bool(false)
int(1)
-int(0)
-bool(false)
-int(1)
-int(0)
diff --git a/ext/standard/tests/strings/strrpos_negative_offset.phpt b/ext/standard/tests/strings/strrpos_negative_offset.phpt
new file mode 100644
index 0000000000..940c2274f4
--- /dev/null
+++ b/ext/standard/tests/strings/strrpos_negative_offset.phpt
@@ -0,0 +1,35 @@
+--TEST--
+strr[i]pos() function with negative offset
+--FILE--
+<?php
+ var_dump(strrpos("haysthack", 'ha', -9));
+ var_dump(strrpos("haystack", 'h', -8));
+ var_dump(strrpos("haystack", 'k', -1));
+ var_dump(strrpos("haystack", "ka", -1));
+ var_dump(strrpos("haystack", 'a', -3));
+ var_dump(strrpos("haystack", 'a', -4));
+ var_dump(@strrpos("haystack", 'h', -9));
+
+ var_dump(strripos("HAYSTHACk", 'ha', -9));
+ var_dump(strripos("HAYSTACK", 'h', -8));
+ var_dump(strripos("HAYSTACK", 'k', -1));
+ var_dump(strripos("HAYSTACK", "ka", -1));
+ var_dump(strripos("HAYSTACK", 'a', -3));
+ var_dump(strripos("HAYSTACK", 'a', -4));
+ var_dump(@strripos("HAYSTACK", 'h', -9));
+?>
+--EXPECT--
+int(0)
+int(0)
+int(7)
+bool(false)
+int(5)
+int(1)
+bool(false)
+int(0)
+int(0)
+int(7)
+bool(false)
+int(5)
+int(1)
+bool(false)