]> granicus.if.org Git - php/commitdiff
Fixed refcounted
authorXinchen Hui <laruence@gmail.com>
Wed, 5 Mar 2014 10:11:22 +0000 (18:11 +0800)
committerXinchen Hui <laruence@gmail.com>
Wed, 5 Mar 2014 10:11:22 +0000 (18:11 +0800)
Zend/zend_API.h
ext/standard/array.c

index d3817ab307850a1a8d479c1bcb43110fc42334d4..da401fe951cf5c03f0758ccf7a279a0191fb8c4c 100644 (file)
@@ -677,18 +677,18 @@ END_EXTERN_C()
                                                                                                                                                                                                                \
                if ((orig_var = zend_hash_str_find(symtable, (name), (name_length))) != NULL                                    \
                        && Z_ISREF_P(orig_var)) {                                                                                                                                       \
-                       Z_SET_REFCOUNT_P(var, Z_REFCOUNT_P(orig_var));                                                                                          \
-                       /*???Z_SET_ISREF_P(var);*/                                                                                                                                      \
-                                                                                                                                                                                                               \
-                       if (_refcount) {                                                                                                                                                        \
-                               Z_SET_REFCOUNT_P(var, Z_REFCOUNT_P(var) + _refcount - 1);                                                               \
+                       if (Z_REFCOUNTED_P(var)) {                                                                                                                                      \
+                               Z_SET_REFCOUNT_P(var, Z_REFCOUNT_P(orig_var));                                                                                  \
+                               if (_refcount) {                                                                                                                                                \
+                                       Z_SET_REFCOUNT_P(var, Z_REFCOUNT_P(var) + _refcount - 1);                                                       \
+                               }                                                                                                                                                                               \
                        }                                                                                                                                                                                       \
                        zval_dtor(orig_var);                                                                                                                                            \
                        ZVAL_COPY_VALUE(orig_var, var);                                                                                                                         \
                        /*???FREE_ZVAL(var);*/                                                                                                                                          \
                } else {                                                                                                                                                                                \
                        /*???Z_SET_ISREF_TO_P(var, _is_ref);*/                                                                                                          \
-                       if (_refcount) {                                                                                                                                                        \
+                       if (_refcount && Z_REFCOUNTED_P(var)) {                                                                                                         \
                                Z_SET_REFCOUNT_P(var, _refcount);                                                                                                               \
                        }                                                                                                                                                                                       \
                        zend_hash_str_update(symtable, (name), (name_length), var);                                                                     \
index 90bbdc03eee480b63188e3375ea2c0b87c9cb56d..aefaef1d87ebcaa2ee0d53f32c7bf21f3cf53f9e 100644 (file)
@@ -1392,7 +1392,7 @@ PHP_FUNCTION(extract)
                                }
                        } else {
                                ZVAL_DUP(&data, entry);
-                               ZEND_SET_SYMBOL_WITH_LENGTH(EG(active_symbol_table), Z_STRVAL(final_name), Z_STRLEN(final_name) + 1, &data, 1, 0);
+                               ZEND_SET_SYMBOL_WITH_LENGTH(EG(active_symbol_table), Z_STRVAL(final_name), Z_STRLEN(final_name), &data, 1, 0);
                        }
                        count++;
                }