diff options
author | Xinchen Hui <laruence@php.net> | 2015-01-18 21:38:25 -0500 |
---|---|---|
committer | Xinchen Hui <laruence@php.net> | 2015-01-18 21:38:25 -0500 |
commit | 0706032b7344ee3be3e95911e18966b3d97bfe39 (patch) | |
tree | 9b60f8c8c1d795b18c367eaa48ffa814259d921a | |
parent | 0be3626ec646fd59bbfb2ed2b3b436f265dd8f1e (diff) | |
download | php-git-0706032b7344ee3be3e95911e18966b3d97bfe39.tar.gz |
Better fix
-rw-r--r-- | ext/standard/string.c | 12 | ||||
-rw-r--r-- | ext/standard/tests/strings/strrpos.phpt | 8 | ||||
-rw-r--r-- | ext/standard/tests/strings/strrpos_negative_offset.phpt | 35 |
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) |