tony2001                Mon Jan 21 14:37:19 2008 UTC

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

  Modified files:              
    /php-src/ext/standard       string.c 
  Log:
  fix #42861 (strtr() crashes in Unicode mode when $from argument is empty) 
  
  
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/string.c?r1=1.664&r2=1.665&diff_format=u
Index: php-src/ext/standard/string.c
diff -u php-src/ext/standard/string.c:1.664 php-src/ext/standard/string.c:1.665
--- php-src/ext/standard/string.c:1.664 Sat Jan 19 19:47:41 2008
+++ php-src/ext/standard/string.c       Mon Jan 21 14:37:19 2008
@@ -18,7 +18,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: string.c,v 1.664 2008/01/19 19:47:41 davidc Exp $ */
+/* $Id: string.c,v 1.665 2008/01/21 14:37:19 tony2001 Exp $ */
 
 /* Synced with php 3.0 revision 1.193 1999-06-16 [ssb] */
 
@@ -4151,6 +4151,7 @@
        int can_optimize = 1;
 
        if ((trlen < 1) || (len < 1)) {
+               *outlen = len;
                return str;
        }
 
@@ -4270,6 +4271,7 @@
                                len = string_key_len-1;
                                if (len < 1) {
                                        zend_hash_destroy(tmp_hash);
+                                       efree(tmp_hash);
                                        return NULL;
                                }
                                zend_u_hash_add(tmp_hash, IS_UNICODE, 
string_key, string_key_len, entry, sizeof(zval*), NULL);
@@ -4506,19 +4508,23 @@
        }
 
        if (Z_TYPE_PP(str) == IS_UNICODE) {
-               int outlen;
+               int outlen = 0;
                UChar *outstr;
 
                if (ac == 2) {
-                       int minlen, maxlen;
+                       int minlen = 0, maxlen = 0;
                        HashTable *hash;
 
                        hash = 
php_u_strtr_array_prepare_hashtable(HASH_OF(*from), &minlen, &maxlen TSRMLS_CC);
-                       outstr = php_u_strtr_array(Z_USTRVAL_PP(str), 
Z_USTRLEN_PP(str), hash, minlen, maxlen, &outlen TSRMLS_CC);
-                       zend_hash_destroy(hash);
-                       efree(hash);
-                       RETVAL_UNICODEL(outstr, outlen, 0);
-                       Z_TYPE_P(return_value) = IS_UNICODE;
+                       if (hash) {
+                               outstr = php_u_strtr_array(Z_USTRVAL_PP(str), 
Z_USTRLEN_PP(str), hash, minlen, maxlen, &outlen TSRMLS_CC);
+                               zend_hash_destroy(hash);
+                               efree(hash);
+                               RETVAL_UNICODEL(outstr, outlen, 0);
+                               Z_TYPE_P(return_value) = IS_UNICODE;
+                       } else {
+                               RETURN_ZVAL(*str, 1, 0);
+                       }
                } else {
                        convert_to_unicode_ex(from);
                        convert_to_unicode_ex(to);
@@ -4531,7 +4537,12 @@
                                          Z_USTRLEN_PP(to),
                                          MIN(Z_USTRLEN_PP(from), 
Z_USTRLEN_PP(to)),
                                          &outlen TSRMLS_CC);
-                       ZVAL_UNICODEL(return_value, outstr, outlen, 0);
+
+                       if (Z_USTRVAL_PP(str) == outstr) {
+                               ZVAL_UNICODEL(return_value, outstr, outlen, 1);
+                       } else {
+                               ZVAL_UNICODEL(return_value, outstr, outlen, 0);
+                       }
 
                        Z_TYPE_P(return_value) = IS_UNICODE;
                }

http://cvs.php.net/viewvc.cgi/php-src/ext/standard/tests/strings/bug42861.phpt?view=markup&rev=1.1
Index: php-src/ext/standard/tests/strings/bug42861.phpt
+++ php-src/ext/standard/tests/strings/bug42861.phpt
--TEST--
Bug #42861 (strtr() crashes in Unicode mode when $from argument is empty)
--FILE--
<?php

var_dump( strtr("hello", array("" => "string") ) );
var_dump( strtr("hello", array('' => "string") ) );
var_dump( strtr("hello", array(null => "string") ) );
var_dump( strtr("hello", array(NULL => "string") ) );

var_dump( strtr("hello", "", "string") );
var_dump( strtr("hello", '', "string") );
var_dump( strtr("hello", NULL, "string") );
var_dump( strtr("hello", null, "string") );

echo "Done\n";
?>
--EXPECTF--     
bool(false)
bool(false)
bool(false)
bool(false)
string(5) "hello"
string(5) "hello"
string(5) "hello"
string(5) "hello"
Done
--UEXPECTF--
unicode(5) "hello"
unicode(5) "hello"
unicode(5) "hello"
unicode(5) "hello"
unicode(5) "hello"
unicode(5) "hello"
unicode(5) "hello"
unicode(5) "hello"
Done

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

Reply via email to