]> granicus.if.org Git - php/commitdiff
Fixed referenced value separation
authorDmitry Stogov <dmitry@zend.com>
Tue, 19 Aug 2014 20:00:59 +0000 (00:00 +0400)
committerDmitry Stogov <dmitry@zend.com>
Tue, 19 Aug 2014 20:00:59 +0000 (00:00 +0400)
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index 7749197a7494b72b8627c530c53a7b77719dc869..34e317c9c0083bd6fda69f497a5007263fc4cb0a 100644 (file)
@@ -4547,7 +4547,10 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET, CONST|TMP|VAR|CV, ANY)
                                        ZVAL_UNREF(array_ref);
                                        array_ptr = array_ref;
                                }
-                               if (Z_IMMUTABLE_P(array_ptr)) {
+                               if (Z_IMMUTABLE_P(array_ptr) ||
+                                   (Z_ISREF_P(array_ref) &&
+                                    Z_REFCOUNTED_P(array_ptr) &&
+                                    Z_REFCOUNT_P(array_ptr) > 1)) {
                                        zval_copy_ctor(array_ptr);
                                }
                                Z_ADDREF_P(array_ref);
index c2e59c14411f7145850ae6d26243155798bf612d..ad879ed7773170ab6bc84d5b6c76df2167ec4072 100644 (file)
@@ -3161,7 +3161,10 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
                                        ZVAL_UNREF(array_ref);
                                        array_ptr = array_ref;
                                }
-                               if (Z_IMMUTABLE_P(array_ptr)) {
+                               if (Z_IMMUTABLE_P(array_ptr) ||
+                                   (Z_ISREF_P(array_ref) &&
+                                    Z_REFCOUNTED_P(array_ptr) &&
+                                    Z_REFCOUNT_P(array_ptr) > 1)) {
                                        zval_copy_ctor(array_ptr);
                                }
                                Z_ADDREF_P(array_ref);
@@ -8678,7 +8681,10 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
                                        ZVAL_UNREF(array_ref);
                                        array_ptr = array_ref;
                                }
-                               if (Z_IMMUTABLE_P(array_ptr)) {
+                               if (Z_IMMUTABLE_P(array_ptr) ||
+                                   (Z_ISREF_P(array_ref) &&
+                                    Z_REFCOUNTED_P(array_ptr) &&
+                                    Z_REFCOUNT_P(array_ptr) > 1)) {
                                        zval_copy_ctor(array_ptr);
                                }
                                Z_ADDREF_P(array_ref);
@@ -14118,7 +14124,10 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
                                        ZVAL_UNREF(array_ref);
                                        array_ptr = array_ref;
                                }
-                               if (Z_IMMUTABLE_P(array_ptr)) {
+                               if (Z_IMMUTABLE_P(array_ptr) ||
+                                   (Z_ISREF_P(array_ref) &&
+                                    Z_REFCOUNTED_P(array_ptr) &&
+                                    Z_REFCOUNT_P(array_ptr) > 1)) {
                                        zval_copy_ctor(array_ptr);
                                }
                                Z_ADDREF_P(array_ref);
@@ -31476,7 +31485,10 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
                                        ZVAL_UNREF(array_ref);
                                        array_ptr = array_ref;
                                }
-                               if (Z_IMMUTABLE_P(array_ptr)) {
+                               if (Z_IMMUTABLE_P(array_ptr) ||
+                                   (Z_ISREF_P(array_ref) &&
+                                    Z_REFCOUNTED_P(array_ptr) &&
+                                    Z_REFCOUNT_P(array_ptr) > 1)) {
                                        zval_copy_ctor(array_ptr);
                                }
                                Z_ADDREF_P(array_ref);