]> granicus.if.org Git - php/commitdiff
fixed refcounting in "$a->magic_prop += 2"
authorDmitry Stogov <dmitry@zend.com>
Thu, 27 Feb 2014 19:18:37 +0000 (23:18 +0400)
committerDmitry Stogov <dmitry@zend.com>
Thu, 27 Feb 2014 19:18:37 +0000 (23:18 +0400)
Zend/zend_object_handlers.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index b27ab71a83fe89a2dcde320d4162998150db4012..62c8ad41c0f2f16ece2ec83db3b8434370a1f527 100644 (file)
@@ -774,7 +774,7 @@ static zval *zend_std_get_property_ptr_ptr(zval *object, zval *member, int type,
        }
 
        if (!zobj->ce->__get ||
-               (guard = zend_get_property_guard(zobj, property_info, member)) ||
+               (guard = zend_get_property_guard(zobj, property_info, member)) == NULL ||
                (property_info && ((*guard) & IN_GET))) {
 
                /* we don't have access controls - will just add it */
index e8657ea510acd5c07f6c5746e9565423a4124853..7fd005fa8d08ceb9df43a44fda438cb5aeb813e3 100644 (file)
@@ -394,7 +394,7 @@ ZEND_VM_HELPER_EX(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMP|VAR
                                        }
                                        z = value;
                                }
-                               Z_ADDREF_P(z);
+                               if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                                SEPARATE_ZVAL_IF_NOT_REF(z);
                                binary_op(z, z, value TSRMLS_CC);
                                if (opline->extended_value == ZEND_ASSIGN_OBJ) {
index 959d028ada0bcfbb8ef93a9d12856e9bf0586b5b..ed8a19f9cf5666f148b1a4542632adf8fa42cf00 100644 (file)
@@ -13932,7 +13932,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_CONST(int (*b
                                        }
                                        z = value;
                                }
-                               Z_ADDREF_P(z);
+                               if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                                SEPARATE_ZVAL_IF_NOT_REF(z);
                                binary_op(z, z, value TSRMLS_CC);
                                if (opline->extended_value == ZEND_ASSIGN_OBJ) {
@@ -16367,7 +16367,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_TMP(int (*bin
                                        }
                                        z = value;
                                }
-                               Z_ADDREF_P(z);
+                               if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                                SEPARATE_ZVAL_IF_NOT_REF(z);
                                binary_op(z, z, value TSRMLS_CC);
                                if (opline->extended_value == ZEND_ASSIGN_OBJ) {
@@ -18378,7 +18378,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_VAR(int (*bin
                                        }
                                        z = value;
                                }
-                               Z_ADDREF_P(z);
+                               if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                                SEPARATE_ZVAL_IF_NOT_REF(z);
                                binary_op(z, z, value TSRMLS_CC);
                                if (opline->extended_value == ZEND_ASSIGN_OBJ) {
@@ -20508,7 +20508,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_UNUSED(int (*
                                        }
                                        z = value;
                                }
-                               Z_ADDREF_P(z);
+                               if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                                SEPARATE_ZVAL_IF_NOT_REF(z);
                                binary_op(z, z, value TSRMLS_CC);
                                if (opline->extended_value == ZEND_ASSIGN_OBJ) {
@@ -21904,7 +21904,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_CV(int (*bina
                                        }
                                        z = value;
                                }
-                               Z_ADDREF_P(z);
+                               if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                                SEPARATE_ZVAL_IF_NOT_REF(z);
                                binary_op(z, z, value TSRMLS_CC);
                                if (opline->extended_value == ZEND_ASSIGN_OBJ) {
@@ -23773,7 +23773,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_CONST(int
                                        }
                                        z = value;
                                }
-                               Z_ADDREF_P(z);
+                               if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                                SEPARATE_ZVAL_IF_NOT_REF(z);
                                binary_op(z, z, value TSRMLS_CC);
                                if (opline->extended_value == ZEND_ASSIGN_OBJ) {
@@ -25130,7 +25130,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_TMP(int (*
                                        }
                                        z = value;
                                }
-                               Z_ADDREF_P(z);
+                               if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                                SEPARATE_ZVAL_IF_NOT_REF(z);
                                binary_op(z, z, value TSRMLS_CC);
                                if (opline->extended_value == ZEND_ASSIGN_OBJ) {
@@ -26404,7 +26404,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_VAR(int (*
                                        }
                                        z = value;
                                }
-                               Z_ADDREF_P(z);
+                               if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                                SEPARATE_ZVAL_IF_NOT_REF(z);
                                binary_op(z, z, value TSRMLS_CC);
                                if (opline->extended_value == ZEND_ASSIGN_OBJ) {
@@ -27679,7 +27679,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_UNUSED(int
                                        }
                                        z = value;
                                }
-                               Z_ADDREF_P(z);
+                               if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                                SEPARATE_ZVAL_IF_NOT_REF(z);
                                binary_op(z, z, value TSRMLS_CC);
                                if (opline->extended_value == ZEND_ASSIGN_OBJ) {
@@ -28081,7 +28081,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_CV(int (*b
                                        }
                                        z = value;
                                }
-                               Z_ADDREF_P(z);
+                               if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                                SEPARATE_ZVAL_IF_NOT_REF(z);
                                binary_op(z, z, value TSRMLS_CC);
                                if (opline->extended_value == ZEND_ASSIGN_OBJ) {
@@ -30832,7 +30832,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_CONST(int (*bi
                                        }
                                        z = value;
                                }
-                               Z_ADDREF_P(z);
+                               if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                                SEPARATE_ZVAL_IF_NOT_REF(z);
                                binary_op(z, z, value TSRMLS_CC);
                                if (opline->extended_value == ZEND_ASSIGN_OBJ) {
@@ -33049,7 +33049,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_TMP(int (*bina
                                        }
                                        z = value;
                                }
-                               Z_ADDREF_P(z);
+                               if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                                SEPARATE_ZVAL_IF_NOT_REF(z);
                                binary_op(z, z, value TSRMLS_CC);
                                if (opline->extended_value == ZEND_ASSIGN_OBJ) {
@@ -34935,7 +34935,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_VAR(int (*bina
                                        }
                                        z = value;
                                }
-                               Z_ADDREF_P(z);
+                               if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                                SEPARATE_ZVAL_IF_NOT_REF(z);
                                binary_op(z, z, value TSRMLS_CC);
                                if (opline->extended_value == ZEND_ASSIGN_OBJ) {
@@ -36940,7 +36940,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_UNUSED(int (*b
                                        }
                                        z = value;
                                }
-                               Z_ADDREF_P(z);
+                               if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                                SEPARATE_ZVAL_IF_NOT_REF(z);
                                binary_op(z, z, value TSRMLS_CC);
                                if (opline->extended_value == ZEND_ASSIGN_OBJ) {
@@ -38205,7 +38205,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_CV(int (*binar
                                        }
                                        z = value;
                                }
-                               Z_ADDREF_P(z);
+                               if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                                SEPARATE_ZVAL_IF_NOT_REF(z);
                                binary_op(z, z, value TSRMLS_CC);
                                if (opline->extended_value == ZEND_ASSIGN_OBJ) {