summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2020-10-16 16:57:50 +0200
committerNikita Popov <nikita.ppv@gmail.com>2020-10-16 16:58:27 +0200
commit28e21d80b0fdee7e4b605adc007f9645a0d830c6 (patch)
treefaae7e73ba30f1b14bc11c6c439227ef2781fd44
parent6669426ab910ec3ebcfd1c778f3683f384bff43b (diff)
downloadphp-git-28e21d80b0fdee7e4b605adc007f9645a0d830c6.tar.gz
Fix leak when setting dynamic property on generator
-rw-r--r--Zend/tests/generators/dynamic_properties.phpt2
-rw-r--r--Zend/zend_object_handlers.c5
2 files changed, 4 insertions, 3 deletions
diff --git a/Zend/tests/generators/dynamic_properties.phpt b/Zend/tests/generators/dynamic_properties.phpt
index d42eed914a..08ceb7f581 100644
--- a/Zend/tests/generators/dynamic_properties.phpt
+++ b/Zend/tests/generators/dynamic_properties.phpt
@@ -9,7 +9,7 @@ function gen() {
$gen = gen();
try {
- $gen->prop = 42;
+ $gen->prop = new stdClass;
} catch (Error $e) {
echo $e->getMessage(), "\n";
}
diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c
index ecf5c71ed8..f091d679f6 100644
--- a/Zend/zend_object_handlers.c
+++ b/Zend/zend_object_handlers.c
@@ -772,11 +772,10 @@ found:
} else {
ZEND_ASSERT(!IS_WRONG_PROPERTY_OFFSET(property_offset));
write_std_property:
- Z_TRY_ADDREF_P(value);
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(property_offset))) {
-
variable_ptr = OBJ_PROP(zobj, property_offset);
+ Z_TRY_ADDREF_P(value);
if (UNEXPECTED(prop_info)) {
ZVAL_COPY_VALUE(&tmp, value);
if (UNEXPECTED(!zend_verify_property_type(prop_info, &tmp, property_uses_strict_types()))) {
@@ -794,6 +793,8 @@ write_std_property:
variable_ptr = &EG(error_zval);
goto exit;
}
+
+ Z_TRY_ADDREF_P(value);
if (!zobj->properties) {
rebuild_object_properties(zobj);
}