]> granicus.if.org Git - php/commitdiff
Fixed segfault in ext/standard/tests/strings/addslashes_variation1.php
authorXinchen Hui <laruence@gmail.com>
Fri, 21 Feb 2014 08:56:23 +0000 (16:56 +0800)
committerXinchen Hui <laruence@gmail.com>
Fri, 21 Feb 2014 08:56:23 +0000 (16:56 +0800)
Zend/zend_interfaces.c
Zend/zend_object_handlers.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index 75f6165c3b93048fbdd0dd432e39054c31f36c86..ab23590960bcfb4d897cf85778a1eb89f90dcde8 100644 (file)
@@ -62,6 +62,7 @@ ZEND_API zval* zend_call_method(zval *object, zend_class_entry *obj_ce, zend_fun
                 * needed later inside zend_call_function. */
                fci.function_table = !object ? EG(function_table) : NULL;
                result = zend_call_function(&fci, NULL TSRMLS_CC);
+               zval_ptr_dtor(&fci.function_name);
        } else {
                zend_fcall_info_cache fcic;
 
@@ -97,6 +98,7 @@ ZEND_API zval* zend_call_method(zval *object, zend_class_entry *obj_ce, zend_fun
                }
                fcic.object_ptr = object;
                result = zend_call_function(&fci, &fcic TSRMLS_CC);
+               zval_ptr_dtor(&fci.function_name);
        }
        if (result == FAILURE) {
                /* error at c-level */
index bf688df65f4ed4c6498490bf46f8ddc779b467f7..eef85d51e78ae66d989e0b4ee746ee9980579d0c 100644 (file)
@@ -1526,9 +1526,9 @@ ZEND_API int zend_std_cast_object_tostring(zval *readobj, zval *writeobj, int ty
                                if (EXPECTED(Z_TYPE(retval) == IS_STRING)) {
 //???                                  INIT_PZVAL(writeobj);
                                        if (readobj == writeobj) {
-                                               zval_dtor(readobj);
+                                               zval_ptr_dtor(readobj);
                                        }
-                                       ZVAL_ZVAL(writeobj, &retval, 1, 1);
+                                       ZVAL_COPY_VALUE(writeobj, &retval);
                                        if (Z_TYPE_P(writeobj) != type) {
                                                convert_to_explicit_type(writeobj, type);
                                        }
@@ -1537,7 +1537,7 @@ ZEND_API int zend_std_cast_object_tostring(zval *readobj, zval *writeobj, int ty
                                        zval_ptr_dtor(&retval);
 //???                                  INIT_PZVAL(writeobj);
                                        if (readobj == writeobj) {
-                                               zval_dtor(readobj);
+                                               zval_ptr_dtor(readobj);
                                        }
                                        ZVAL_EMPTY_STRING(writeobj);
                                        zend_error(E_RECOVERABLE_ERROR, "Method %s::__toString() must return a string value", ce->name->val);
index b8868e2a96dae53e7f2e1257d2ffe5d227cad99c..8c0971195c1259ec6272872d2d6dfb4675327a77 100644 (file)
@@ -3620,7 +3620,9 @@ ZEND_VM_HANDLER(72, ZEND_ADD_ARRAY_ELEMENT, CONST|TMP|VAR|CV, CONST|TMP|VAR|UNUS
                        zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
                }
                SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
-               Z_ADDREF_P(expr_ptr);
+               if (Z_COUNTED_P(expr_ptr)) {
+                       Z_ADDREF_P(expr_ptr);
+               }
        } else {
                expr_ptr=GET_OP1_ZVAL_PTR(BP_VAR_R);
                if (IS_OP1_TMP_FREE()) { /* temporary variable */
@@ -3634,7 +3636,7 @@ ZEND_VM_HANDLER(72, ZEND_ADD_ARRAY_ELEMENT, CONST|TMP|VAR|CV, CONST|TMP|VAR|UNUS
             ZVAL_DUP(&new_expr, expr_ptr);
                        expr_ptr = &new_expr;
                        FREE_OP1_IF_VAR();
-               } else if (OP1_TYPE == IS_CV) {
+               } else if (OP1_TYPE == IS_CV && Z_COUNTED_P(expr_ptr)) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
index dc54e0efea933a217acccbb43c116a4da45d91e4..be5c464ff853ebda5eb85c4573a961ba81b7aa6b 100644 (file)
@@ -3910,7 +3910,9 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CONST_HANDLER(ZEND_O
                        zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
                }
                SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
-               Z_ADDREF_P(expr_ptr);
+               if (Z_COUNTED_P(expr_ptr)) {
+                       Z_ADDREF_P(expr_ptr);
+               }
        } else {
                expr_ptr=opline->op1.zv;
                if (0) { /* temporary variable */
@@ -3924,7 +3926,7 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CONST_HANDLER(ZEND_O
             ZVAL_DUP(&new_expr, expr_ptr);
                        expr_ptr = &new_expr;
 
-               } else if (IS_CONST == IS_CV) {
+               } else if (IS_CONST == IS_CV && Z_COUNTED_P(expr_ptr)) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
@@ -4747,7 +4749,9 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMP_HANDLER(ZEND_OPC
                        zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
                }
                SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
-               Z_ADDREF_P(expr_ptr);
+               if (Z_COUNTED_P(expr_ptr)) {
+                       Z_ADDREF_P(expr_ptr);
+               }
        } else {
                expr_ptr=opline->op1.zv;
                if (0) { /* temporary variable */
@@ -4761,7 +4765,7 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMP_HANDLER(ZEND_OPC
             ZVAL_DUP(&new_expr, expr_ptr);
                        expr_ptr = &new_expr;
 
-               } else if (IS_CONST == IS_CV) {
+               } else if (IS_CONST == IS_CV && Z_COUNTED_P(expr_ptr)) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
@@ -5544,7 +5548,9 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_VAR_HANDLER(ZEND_OPC
                        zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
                }
                SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
-               Z_ADDREF_P(expr_ptr);
+               if (Z_COUNTED_P(expr_ptr)) {
+                       Z_ADDREF_P(expr_ptr);
+               }
        } else {
                expr_ptr=opline->op1.zv;
                if (0) { /* temporary variable */
@@ -5558,7 +5564,7 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_VAR_HANDLER(ZEND_OPC
             ZVAL_DUP(&new_expr, expr_ptr);
                        expr_ptr = &new_expr;
 
-               } else if (IS_CONST == IS_CV) {
+               } else if (IS_CONST == IS_CV && Z_COUNTED_P(expr_ptr)) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
@@ -6193,7 +6199,9 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_UNUSED_HANDLER(ZEND_
                        zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
                }
                SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
-               Z_ADDREF_P(expr_ptr);
+               if (Z_COUNTED_P(expr_ptr)) {
+                       Z_ADDREF_P(expr_ptr);
+               }
        } else {
                expr_ptr=opline->op1.zv;
                if (0) { /* temporary variable */
@@ -6207,7 +6215,7 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_UNUSED_HANDLER(ZEND_
             ZVAL_DUP(&new_expr, expr_ptr);
                        expr_ptr = &new_expr;
 
-               } else if (IS_CONST == IS_CV) {
+               } else if (IS_CONST == IS_CV && Z_COUNTED_P(expr_ptr)) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
@@ -7073,7 +7081,9 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CV_HANDLER(ZEND_OPCO
                        zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
                }
                SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
-               Z_ADDREF_P(expr_ptr);
+               if (Z_COUNTED_P(expr_ptr)) {
+                       Z_ADDREF_P(expr_ptr);
+               }
        } else {
                expr_ptr=opline->op1.zv;
                if (0) { /* temporary variable */
@@ -7087,7 +7097,7 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CV_HANDLER(ZEND_OPCO
             ZVAL_DUP(&new_expr, expr_ptr);
                        expr_ptr = &new_expr;
 
-               } else if (IS_CONST == IS_CV) {
+               } else if (IS_CONST == IS_CV && Z_COUNTED_P(expr_ptr)) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
@@ -8836,7 +8846,9 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CONST_HANDLER(ZEND_OPC
                        zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
                }
                SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
-               Z_ADDREF_P(expr_ptr);
+               if (Z_COUNTED_P(expr_ptr)) {
+                       Z_ADDREF_P(expr_ptr);
+               }
        } else {
                expr_ptr=_get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
                if (1) { /* temporary variable */
@@ -8850,7 +8862,7 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CONST_HANDLER(ZEND_OPC
             ZVAL_DUP(&new_expr, expr_ptr);
                        expr_ptr = &new_expr;
 
-               } else if (IS_TMP_VAR == IS_CV) {
+               } else if (IS_TMP_VAR == IS_CV && Z_COUNTED_P(expr_ptr)) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
@@ -9648,7 +9660,9 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMP_HANDLER(ZEND_OPCOD
                        zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
                }
                SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
-               Z_ADDREF_P(expr_ptr);
+               if (Z_COUNTED_P(expr_ptr)) {
+                       Z_ADDREF_P(expr_ptr);
+               }
        } else {
                expr_ptr=_get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
                if (1) { /* temporary variable */
@@ -9662,7 +9676,7 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMP_HANDLER(ZEND_OPCOD
             ZVAL_DUP(&new_expr, expr_ptr);
                        expr_ptr = &new_expr;
 
-               } else if (IS_TMP_VAR == IS_CV) {
+               } else if (IS_TMP_VAR == IS_CV && Z_COUNTED_P(expr_ptr)) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
@@ -10453,7 +10467,9 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_VAR_HANDLER(ZEND_OPCOD
                        zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
                }
                SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
-               Z_ADDREF_P(expr_ptr);
+               if (Z_COUNTED_P(expr_ptr)) {
+                       Z_ADDREF_P(expr_ptr);
+               }
        } else {
                expr_ptr=_get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
                if (1) { /* temporary variable */
@@ -10467,7 +10483,7 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_VAR_HANDLER(ZEND_OPCOD
             ZVAL_DUP(&new_expr, expr_ptr);
                        expr_ptr = &new_expr;
 
-               } else if (IS_TMP_VAR == IS_CV) {
+               } else if (IS_TMP_VAR == IS_CV && Z_COUNTED_P(expr_ptr)) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
@@ -10991,7 +11007,9 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_UNUSED_HANDLER(ZEND_OP
                        zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
                }
                SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
-               Z_ADDREF_P(expr_ptr);
+               if (Z_COUNTED_P(expr_ptr)) {
+                       Z_ADDREF_P(expr_ptr);
+               }
        } else {
                expr_ptr=_get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
                if (1) { /* temporary variable */
@@ -11005,7 +11023,7 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_UNUSED_HANDLER(ZEND_OP
             ZVAL_DUP(&new_expr, expr_ptr);
                        expr_ptr = &new_expr;
 
-               } else if (IS_TMP_VAR == IS_CV) {
+               } else if (IS_TMP_VAR == IS_CV && Z_COUNTED_P(expr_ptr)) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
@@ -11800,7 +11818,9 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CV_HANDLER(ZEND_OPCODE
                        zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
                }
                SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
-               Z_ADDREF_P(expr_ptr);
+               if (Z_COUNTED_P(expr_ptr)) {
+                       Z_ADDREF_P(expr_ptr);
+               }
        } else {
                expr_ptr=_get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
                if (1) { /* temporary variable */
@@ -11814,7 +11834,7 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CV_HANDLER(ZEND_OPCODE
             ZVAL_DUP(&new_expr, expr_ptr);
                        expr_ptr = &new_expr;
 
-               } else if (IS_TMP_VAR == IS_CV) {
+               } else if (IS_TMP_VAR == IS_CV && Z_COUNTED_P(expr_ptr)) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
@@ -15053,7 +15073,9 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CONST_HANDLER(ZEND_OPC
                        zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
                }
                SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
-               Z_ADDREF_P(expr_ptr);
+               if (Z_COUNTED_P(expr_ptr)) {
+                       Z_ADDREF_P(expr_ptr);
+               }
        } else {
                expr_ptr=_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
                if (0) { /* temporary variable */
@@ -15067,7 +15089,7 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CONST_HANDLER(ZEND_OPC
             ZVAL_DUP(&new_expr, expr_ptr);
                        expr_ptr = &new_expr;
                        zval_ptr_dtor_nogc(free_op1.var);
-               } else if (IS_VAR == IS_CV) {
+               } else if (IS_VAR == IS_CV && Z_COUNTED_P(expr_ptr)) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
@@ -17181,7 +17203,9 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMP_HANDLER(ZEND_OPCOD
                        zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
                }
                SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
-               Z_ADDREF_P(expr_ptr);
+               if (Z_COUNTED_P(expr_ptr)) {
+                       Z_ADDREF_P(expr_ptr);
+               }
        } else {
                expr_ptr=_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
                if (0) { /* temporary variable */
@@ -17195,7 +17219,7 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMP_HANDLER(ZEND_OPCOD
             ZVAL_DUP(&new_expr, expr_ptr);
                        expr_ptr = &new_expr;
                        zval_ptr_dtor_nogc(free_op1.var);
-               } else if (IS_VAR == IS_CV) {
+               } else if (IS_VAR == IS_CV && Z_COUNTED_P(expr_ptr)) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
@@ -19356,7 +19380,9 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_VAR_HANDLER(ZEND_OPCOD
                        zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
                }
                SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
-               Z_ADDREF_P(expr_ptr);
+               if (Z_COUNTED_P(expr_ptr)) {
+                       Z_ADDREF_P(expr_ptr);
+               }
        } else {
                expr_ptr=_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
                if (0) { /* temporary variable */
@@ -19370,7 +19396,7 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_VAR_HANDLER(ZEND_OPCOD
             ZVAL_DUP(&new_expr, expr_ptr);
                        expr_ptr = &new_expr;
                        zval_ptr_dtor_nogc(free_op1.var);
-               } else if (IS_VAR == IS_CV) {
+               } else if (IS_VAR == IS_CV && Z_COUNTED_P(expr_ptr)) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
@@ -20692,7 +20718,9 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_UNUSED_HANDLER(ZEND_OP
                        zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
                }
                SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
-               Z_ADDREF_P(expr_ptr);
+               if (Z_COUNTED_P(expr_ptr)) {
+                       Z_ADDREF_P(expr_ptr);
+               }
        } else {
                expr_ptr=_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
                if (0) { /* temporary variable */
@@ -20706,7 +20734,7 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_UNUSED_HANDLER(ZEND_OP
             ZVAL_DUP(&new_expr, expr_ptr);
                        expr_ptr = &new_expr;
                        zval_ptr_dtor_nogc(free_op1.var);
-               } else if (IS_VAR == IS_CV) {
+               } else if (IS_VAR == IS_CV && Z_COUNTED_P(expr_ptr)) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
@@ -22606,7 +22634,9 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CV_HANDLER(ZEND_OPCODE
                        zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
                }
                SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
-               Z_ADDREF_P(expr_ptr);
+               if (Z_COUNTED_P(expr_ptr)) {
+                       Z_ADDREF_P(expr_ptr);
+               }
        } else {
                expr_ptr=_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
                if (0) { /* temporary variable */
@@ -22620,7 +22650,7 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CV_HANDLER(ZEND_OPCODE
             ZVAL_DUP(&new_expr, expr_ptr);
                        expr_ptr = &new_expr;
                        zval_ptr_dtor_nogc(free_op1.var);
-               } else if (IS_VAR == IS_CV) {
+               } else if (IS_VAR == IS_CV && Z_COUNTED_P(expr_ptr)) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
@@ -31338,7 +31368,9 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CONST_HANDLER(ZEND_OPCO
                        zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
                }
                SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
-               Z_ADDREF_P(expr_ptr);
+               if (Z_COUNTED_P(expr_ptr)) {
+                       Z_ADDREF_P(expr_ptr);
+               }
        } else {
                expr_ptr=_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
                if (0) { /* temporary variable */
@@ -31352,7 +31384,7 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CONST_HANDLER(ZEND_OPCO
             ZVAL_DUP(&new_expr, expr_ptr);
                        expr_ptr = &new_expr;
 
-               } else if (IS_CV == IS_CV) {
+               } else if (IS_CV == IS_CV && Z_COUNTED_P(expr_ptr)) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
@@ -33340,7 +33372,9 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMP_HANDLER(ZEND_OPCODE
                        zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
                }
                SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
-               Z_ADDREF_P(expr_ptr);
+               if (Z_COUNTED_P(expr_ptr)) {
+                       Z_ADDREF_P(expr_ptr);
+               }
        } else {
                expr_ptr=_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
                if (0) { /* temporary variable */
@@ -33354,7 +33388,7 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMP_HANDLER(ZEND_OPCODE
             ZVAL_DUP(&new_expr, expr_ptr);
                        expr_ptr = &new_expr;
 
-               } else if (IS_CV == IS_CV) {
+               } else if (IS_CV == IS_CV && Z_COUNTED_P(expr_ptr)) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
@@ -35389,7 +35423,9 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_VAR_HANDLER(ZEND_OPCODE
                        zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
                }
                SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
-               Z_ADDREF_P(expr_ptr);
+               if (Z_COUNTED_P(expr_ptr)) {
+                       Z_ADDREF_P(expr_ptr);
+               }
        } else {
                expr_ptr=_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
                if (0) { /* temporary variable */
@@ -35403,7 +35439,7 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_VAR_HANDLER(ZEND_OPCODE
             ZVAL_DUP(&new_expr, expr_ptr);
                        expr_ptr = &new_expr;
 
-               } else if (IS_CV == IS_CV) {
+               } else if (IS_CV == IS_CV && Z_COUNTED_P(expr_ptr)) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
@@ -36606,7 +36642,9 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUSED_HANDLER(ZEND_OPC
                        zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
                }
                SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
-               Z_ADDREF_P(expr_ptr);
+               if (Z_COUNTED_P(expr_ptr)) {
+                       Z_ADDREF_P(expr_ptr);
+               }
        } else {
                expr_ptr=_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
                if (0) { /* temporary variable */
@@ -36620,7 +36658,7 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUSED_HANDLER(ZEND_OPC
             ZVAL_DUP(&new_expr, expr_ptr);
                        expr_ptr = &new_expr;
 
-               } else if (IS_CV == IS_CV) {
+               } else if (IS_CV == IS_CV && Z_COUNTED_P(expr_ptr)) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
@@ -38381,7 +38419,9 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_
                        zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
                }
                SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
-               Z_ADDREF_P(expr_ptr);
+               if (Z_COUNTED_P(expr_ptr)) {
+                       Z_ADDREF_P(expr_ptr);
+               }
        } else {
                expr_ptr=_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
                if (0) { /* temporary variable */
@@ -38395,7 +38435,7 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_
             ZVAL_DUP(&new_expr, expr_ptr);
                        expr_ptr = &new_expr;
 
-               } else if (IS_CV == IS_CV) {
+               } else if (IS_CV == IS_CV && Z_COUNTED_P(expr_ptr)) {
                        Z_ADDREF_P(expr_ptr);
                }
        }