]> granicus.if.org Git - php/commitdiff
Don't return persistent string from get_cfg_var()
authorNikita Popov <nikita.ppv@gmail.com>
Tue, 13 Aug 2019 12:40:07 +0000 (14:40 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Tue, 13 Aug 2019 12:50:01 +0000 (14:50 +0200)
This is not thread-safe.

ext/standard/basic_functions.c

index 2e13e1afb7782c6bce60399d30a5e39ea01d48f5..9b937319c26d06b7072aa9e826eff39a10c6bbad 100644 (file)
@@ -4690,10 +4690,19 @@ static void add_config_entries(HashTable *hash, zval *return_value);
 static void add_config_entry(zend_ulong h, zend_string *key, zval *entry, zval *retval)
 {
        if (Z_TYPE_P(entry) == IS_STRING) {
+               zend_string *str = Z_STR_P(entry);
+               if (!ZSTR_IS_INTERNED(str)) {
+                       if (!(GC_FLAGS(str) & GC_PERSISTENT)) {
+                               zend_string_addref(str);
+                       } else {
+                               str = zend_string_init(ZSTR_VAL(str), ZSTR_LEN(str), 0);
+                       }
+               }
+
                if (key) {
-                       add_assoc_str_ex(retval, ZSTR_VAL(key), ZSTR_LEN(key), zend_string_copy(Z_STR_P(entry)));
+                       add_assoc_str_ex(retval, ZSTR_VAL(key), ZSTR_LEN(key), str);
                } else {
-                       add_index_str(retval, h, zend_string_copy(Z_STR_P(entry)));
+                       add_index_str(retval, h, str);
                }
        } else if (Z_TYPE_P(entry) == IS_ARRAY) {
                zval tmp;