tony2001                Fri Nov 24 21:57:31 2006 UTC

  Added files:                 
    /php-src/ext/standard/tests/strings bug39621.phpt 

  Modified files:              
    /php-src/ext/standard       string.c 
  Log:
  fix #39621 (str_replace() is not binary safe on strings with equal length)
  
  
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/string.c?r1=1.613&r2=1.614&diff_format=u
Index: php-src/ext/standard/string.c
diff -u php-src/ext/standard/string.c:1.613 php-src/ext/standard/string.c:1.614
--- php-src/ext/standard/string.c:1.613 Fri Nov 17 16:45:28 2006
+++ php-src/ext/standard/string.c       Fri Nov 24 21:57:31 2006
@@ -18,7 +18,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: string.c,v 1.613 2006/11/17 16:45:28 andrei Exp $ */
+/* $Id: string.c,v 1.614 2006/11/24 21:57:31 tony2001 Exp $ */
 
 /* Synced with php 3.0 revision 1.193 1999-06-16 [ssb] */
 
@@ -5150,16 +5150,33 @@
                new_str = estrndup(haystack, length);
                return new_str;
        } else {
-               if (case_sensitivity ? strncmp(haystack, needle, length) : 
strncasecmp(haystack, needle, length)) {
+               if (case_sensitivity && memcmp(haystack, needle, length)) {
                        goto nothing_todo;
-               } else {
-                       *_new_length = str_len;
-                       new_str = estrndup(str, str_len);
-                       if (replace_count) {
-                               (*replace_count)++;
+               } else if (!case_sensitivity) {
+                       char *l_haystack, *l_needle;
+
+                       l_haystack = estrndup(haystack, length);
+                       l_needle = estrndup(needle, length);
+
+                       php_strtolower(l_haystack, length);
+                       php_strtolower(l_needle, length);
+
+                       if (memcmp(l_haystack, l_needle, length)) {
+                               efree(l_haystack);
+                               efree(l_needle);
+                               goto nothing_todo;
                        }
-                       return new_str;
+                       efree(l_haystack);
+                       efree(l_needle);
+               }
+
+               *_new_length = str_len;
+               new_str = estrndup(str, str_len);
+
+               if (replace_count) {
+                       (*replace_count)++;
                }
+               return new_str;
        }
 
 }
@@ -5253,7 +5270,7 @@
                new_str = eustrndup(haystack, length);
                return new_str;
        } else {
-               if (u_strncmp(haystack, needle, length)) {
+               if (u_memcmp(haystack, needle, length)) {
                        goto nothing_todo;
                } else {
                        *_new_length = repl_len;

http://cvs.php.net/viewvc.cgi/php-src/ext/standard/tests/strings/bug39621.phpt?view=markup&rev=1.1
Index: php-src/ext/standard/tests/strings/bug39621.phpt
+++ php-src/ext/standard/tests/strings/bug39621.phpt
--TEST--
Bug #39621 (str_replace() is not binary safe on strings with equal length)
--FILE--
<?php

$search =  "qxxx\0qqqqqqqq";
$subject = "qxxx\0xxxxxxxx";
$replace = "any text";

$result = str_replace ( $search, $replace, $subject );

var_dump($result);

$search =  "QXXX\0qqqqqqqq";
$subject = "qxxx\0xxxxxxxx";
$replace = "any text";

$result = str_ireplace ( $search, $replace, $subject );

var_dump($result);

$search =  "qxxx\0xxxxxxxx";
$subject = "qxxx\0xxxxxxxx";
$replace = "any text";

$result = str_replace ( $search, $replace, $subject );

var_dump($result);

$search =  "qXxx\0xXxXxXxx";
$subject = "qxXx\0xxxxxxxx";
$replace = "any text";

$result = str_ireplace ( $search, $replace, $subject );

var_dump($result);

echo "Done\n";
?>
--EXPECTF--     
string(13) "qxxx
string(13) "qxxx
string(8) "any text"
string(8) "any text"
Done
--UEXPECTF--
unicode(13) "qxxx
unicode(13) "qxxx
unicode(8) "any text"
unicode(8) "any text"
Done

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to