From: Xinchen Hui Date: Fri, 21 Feb 2014 08:56:23 +0000 (+0800) Subject: Fixed segfault in ext/standard/tests/strings/addslashes_variation1.php X-Git-Tag: POST_PHPNG_MERGE~412^2~597^2~7 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e193944b3eec77a58d8eb727cb0364de6b70dd72;p=php Fixed segfault in ext/standard/tests/strings/addslashes_variation1.php --- diff --git a/Zend/zend_interfaces.c b/Zend/zend_interfaces.c index 75f6165c3b..ab23590960 100644 --- a/Zend/zend_interfaces.c +++ b/Zend/zend_interfaces.c @@ -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 */ diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index bf688df65f..eef85d51e7 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -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); diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index b8868e2a96..8c0971195c 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -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); } } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index dc54e0efea..be5c464ff8 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -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); } }