Skip to content

Commit 20f3416

Browse files
committed
Fixed bug #69872 (uninitialised value in strtr with array)
1 parent 7cde797 commit 20f3416

File tree

1 file changed

+10
-11
lines changed

1 file changed

+10
-11
lines changed

ext/standard/string.c

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2988,7 +2988,7 @@ static void php_strtr_array(zval *return_value, zend_string *input, HashTable *p
29882988
size_t minlen = 128*1024;
29892989
size_t maxlen = 0;
29902990
HashTable str_hash;
2991-
zval *entry, tmp, dummy;
2991+
zval *entry, dummy;
29922992
char *key;
29932993
smart_str result = {0};
29942994
zend_ulong bitset[256/sizeof(zend_ulong)];
@@ -3024,17 +3024,15 @@ static void php_strtr_array(zval *return_value, zend_string *input, HashTable *p
30243024
} ZEND_HASH_FOREACH_END();
30253025

30263026
if (UNEXPECTED(num_keys)) {
3027+
zend_string *key_used;
30273028
/* we have to rebuild HashTable with numeric keys */
30283029
zend_hash_init(&str_hash, zend_hash_num_elements(pats), NULL, NULL, 0);
30293030
ZEND_HASH_FOREACH_KEY_VAL(pats, num_key, str_key, entry) {
30303031
if (UNEXPECTED(!str_key)) {
3031-
ZVAL_LONG(&tmp, num_key);
3032-
convert_to_string(&tmp);
3033-
str_key = Z_STR(tmp);
3034-
len = str_key->len;
3032+
key_used = zend_long_to_str(num_key);
3033+
len = key_used->len;
30353034
if (UNEXPECTED(len > slen)) {
30363035
/* skip long patterns */
3037-
zval_dtor(&tmp);
30383036
continue;
30393037
}
30403038
if (len > maxlen) {
@@ -3045,17 +3043,18 @@ static void php_strtr_array(zval *return_value, zend_string *input, HashTable *p
30453043
}
30463044
/* remember possible key length */
30473045
num_bitset[len / sizeof(zend_ulong)] |= Z_UL(1) << (len % sizeof(zend_ulong));
3048-
bitset[((unsigned char)str_key->val[0]) / sizeof(zend_ulong)] |= Z_UL(1) << (((unsigned char)str_key->val[0]) % sizeof(zend_ulong));
3046+
bitset[((unsigned char)key_used->val[0]) / sizeof(zend_ulong)] |= Z_UL(1) << (((unsigned char)key_used->val[0]) % sizeof(zend_ulong));
30493047
} else {
3050-
len = str_key->len;
3048+
key_used = str_key;
3049+
len = key_used->len;
30513050
if (UNEXPECTED(len > slen)) {
30523051
/* skip long patterns */
30533052
continue;
30543053
}
30553054
}
3056-
zend_hash_add(&str_hash, str_key, entry);
3057-
if (str_key == Z_STR(tmp)) {
3058-
zval_dtor(&tmp);
3055+
zend_hash_add(&str_hash, key_used, entry);
3056+
if (UNEXPECTED(!str_key)) {
3057+
zend_string_release(key_used);
30593058
}
30603059
} ZEND_HASH_FOREACH_END();
30613060
pats = &str_hash;

0 commit comments

Comments
 (0)