diff --git a/ext/json/json_encoder.c b/ext/json/json_encoder.c index 4145bc2b6154..cefee25de90a 100644 --- a/ext/json/json_encoder.c +++ b/ext/json/json_encoder.c @@ -287,6 +287,7 @@ static zend_result php_json_encode_array(smart_str *buf, zval *val, int options, if (EG(exception)) { PHP_JSON_HASH_UNPROTECT_RECURSION(recursion_rc); zend_release_properties(prop_ht); + zval_ptr_dtor(&tmp); return FAILURE; } } diff --git a/ext/json/tests/json_encode_hooked_property_throwing_getter.phpt b/ext/json/tests/json_encode_hooked_property_throwing_getter.phpt new file mode 100644 index 000000000000..63fc8cf42c0e --- /dev/null +++ b/ext/json/tests/json_encode_hooked_property_throwing_getter.phpt @@ -0,0 +1,44 @@ +--TEST-- +json_encode() releases the hooked property value when the get hook throws +--FILE-- +getMessage(), "\n"; +} + +echo "done\n"; + +?> +--EXPECT-- +Value::__destruct +Exception: thrown while freeing the get hook frame +done