]> granicus.if.org Git - php/commitdiff
Fix bug #55451
authorLauri Kenttä <lauri.kentta@gmail.com>
Wed, 3 Aug 2016 08:29:12 +0000 (11:29 +0300)
committerNikita Popov <nikic@php.net>
Sun, 7 Aug 2016 16:48:36 +0000 (18:48 +0200)
Make substr_compare ignore the length if it's NULL. This allows to
use the last parameter (case_insensitivity) with the default length.

NEWS
ext/standard/string.c
ext/standard/tests/strings/bug55451.phpt [new file with mode: 0644]
ext/standard/tests/strings/substr_compare.phpt

diff --git a/NEWS b/NEWS
index dbcca1aee72127530301868a2cb7393ba6819918..0d4ac3a20d11934710588b83b4f11f6a0371bc92 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -16,6 +16,10 @@ PHP                                                                        NEWS
 - Session:
   . Fixed bug #72724 (PHP7: session-uploadprogress kills httpd). (Nikita)
 
+- Standard:
+  . Fixed bug #55451 (substr_compare NULL length interpreted as 0). (Lauri
+    Kenttä)
+
 - Streams:
   . Fixed bug #72764 (ftps:// opendir wrapper data channel encryption fails
     with IIS FTP 7.5, 8.5). (vhuk)
index 2b87791cda8ec6e31e5461b5969dc1549aa872db..7c456c41ee11a18e69fce998330f2790871da575 100644 (file)
@@ -5700,14 +5700,15 @@ PHP_FUNCTION(substr_compare)
 {
        zend_string *s1, *s2;
        zend_long offset, len=0;
+       zend_bool len_is_default=1;
        zend_bool cs=0;
        size_t cmp_len;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "SSl|lb", &s1, &s2, &offset, &len, &cs) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "SSl|l!b", &s1, &s2, &offset, &len, &len_is_default, &cs) == FAILURE) {
                RETURN_FALSE;
        }
 
-       if (ZEND_NUM_ARGS() >= 4 && len <= 0) {
+       if (!len_is_default && len <= 0) {
                if (len == 0) {
                        RETURN_LONG(0L);
                } else {
diff --git a/ext/standard/tests/strings/bug55451.phpt b/ext/standard/tests/strings/bug55451.phpt
new file mode 100644 (file)
index 0000000..4759965
--- /dev/null
@@ -0,0 +1,14 @@
+--TEST--
+Bug #55451 (substr_compare with NULL as default length)
+--FILE--
+<?php
+var_dump(substr_compare("abcde", "ABCD", 0, NULL, false) != 0);
+var_dump(substr_compare("abcde", "ABCD", 0, NULL, true) != 0);
+var_dump(substr_compare("abcde", "ABCDE", 0, NULL, false) != 0);
+var_dump(substr_compare("abcde", "ABCDE", 0, NULL, true) == 0);
+?>
+--EXPECT--
+bool(true)
+bool(true)
+bool(true)
+bool(true)
index 2012fe07ebdb8d8a88b214be03318810ecd33248..c78dfca43e04203fea0cfe67dae7546c7a0a1ed3 100644 (file)
@@ -39,7 +39,7 @@ Test
 
 Warning: substr_compare(): The length must be greater than or equal to zero in %s on line %d
 bool(false)
-int(0)
+int(4)
 
 Warning: substr_compare() expects parameter 4 to be integer, string given in %s on line %d
 bool(false)