{
HashTable *output, *chash;
zend_long idx;
- zend_string *key, *key_tmp;
+ zend_string *key;
zval *entry, entry_tmp;
size_t ckey_len, cval_len;
char *ckey, *cval;
/* convert key */
if (key) {
ckey = php_mb_convert_encoding(ZSTR_VAL(key), ZSTR_LEN(key), _to_encoding, _from_encodings, &ckey_len);
- key_tmp = zend_string_init(ckey, ckey_len, 0);
+ key = zend_string_init(ckey, ckey_len, 0);
+ efree(ckey);
}
/* convert value */
ZEND_ASSERT(entry);
case IS_OBJECT:
default:
if (key) {
- efree(key_tmp);
+ zend_string_release(key);
}
php_error_docref(NULL, E_WARNING, "Object is not supported");
continue;
}
if (key) {
- zend_hash_add(output, key_tmp, &entry_tmp);
+ zend_hash_add(output, key, &entry_tmp);
+ zend_string_release(key);
} else {
zend_hash_index_add(output, idx, &entry_tmp);
}
--- /dev/null
+--TEST--
+mb_convert_encoding() shouldn't leak keys
+--FILE--
+<?php
+
+$x = "x";
+$array = ["foo" . $x => "bar"];
+mb_convert_encoding($array, 'UTF-8', 'UTF-8');
+var_dump($array);
+
+?>
+--EXPECT--
+array(1) {
+ ["foox"]=>
+ string(3) "bar"
+}