int can_optimize = 1;
if ((trlen < 1) || (len < 1)) {
+ *outlen = len;
return str;
}
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);
}
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);
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;
}
--- /dev/null
+--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