diff --git a/Zend/tests/in-de-crement/oss-fuzz-60709_globals.phpt b/Zend/tests/in-de-crement/oss-fuzz-60709_globals_unset_after_undef_warning.phpt similarity index 88% rename from Zend/tests/in-de-crement/oss-fuzz-60709_globals.phpt rename to Zend/tests/in-de-crement/oss-fuzz-60709_globals_unset_after_undef_warning.phpt index d6405a28f966..e981800eeac1 100644 --- a/Zend/tests/in-de-crement/oss-fuzz-60709_globals.phpt +++ b/Zend/tests/in-de-crement/oss-fuzz-60709_globals_unset_after_undef_warning.phpt @@ -1,5 +1,5 @@ --TEST-- -oss-fuzz #60709: Test +oss-fuzz #60709: Unsetting variable after undefined variable warning in ++/-- --FILE-- +--EXPECT-- +POST DEC +Decrement on non-numeric string has no effect and is deprecated +string(1) " " +PRE DEC +Decrement on non-numeric string has no effect and is deprecated +string(1) " " +POST INC +Increment on non-alphanumeric string is deprecated +string(1) " " +PRE INC +Increment on non-alphanumeric string is deprecated +string(1) " " diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index 7f1b3234acea..8853d24549fb 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -2528,13 +2528,10 @@ static bool ZEND_FASTCALL increment_string(zval *str) /* {{{ */ if (UNEXPECTED(!zend_string_only_has_ascii_alphanumeric(Z_STR_P(str)))) { zend_string *zstr = Z_STR_P(str); - GC_TRY_ADDREF(zstr); + zend_string_addref(zstr); zend_error(E_DEPRECATED, "Increment on non-alphanumeric string is deprecated"); if (EG(exception)) { - GC_TRY_DELREF(zstr); - if (!GC_REFCOUNT(zstr)) { - efree(zstr); - } + zend_string_release(zstr); return false; } zval_ptr_dtor(str); @@ -2737,11 +2734,18 @@ ZEND_API zend_result ZEND_FASTCALL decrement_function(zval *op1) /* {{{ */ zval_ptr_dtor_str(op1); ZVAL_DOUBLE(op1, dval - 1); break; - default: + default: { + /* Error handler can unset the variable */ + zend_string *zstr = Z_STR_P(op1); + zend_string_addref(zstr); zend_error(E_DEPRECATED, "Decrement on non-numeric string has no effect and is deprecated"); if (EG(exception)) { + zend_string_release(zstr); return FAILURE; } + zval_ptr_dtor(op1); + ZVAL_STR(op1, zstr); + } } break; case IS_NULL: {