cvs: php-src /ext/standard string.c /ext/standard/tests/strings bug39621.phpt

From: Date: Fri, 24 Nov 2006 21:57:31 +0000
Subject: cvs: php-src /ext/standard string.c /ext/standard/tests/strings bug39621.phpt
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-41730@lists.php.net to get a copy of this message
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

« previous php.cvs (#41730) next »