summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2019-12-18 10:24:02 +0100
committerNikita Popov <nikita.ppv@gmail.com>2019-12-18 10:24:02 +0100
commitb965f158aca1babc4d68f25f10129e237af9992f (patch)
tree776becc4e559d884d861d9076d7f4aa821c19ab8
parentee89e733121c0da360cd6329d7411083cb743429 (diff)
downloadphp-git-b965f158aca1babc4d68f25f10129e237af9992f.tar.gz
Fix use-after-free when trying to write to closure property
-rw-r--r--Zend/tests/closure_write_prop.phpt22
-rw-r--r--Zend/zend_closures.c2
2 files changed, 23 insertions, 1 deletions
diff --git a/Zend/tests/closure_write_prop.phpt b/Zend/tests/closure_write_prop.phpt
new file mode 100644
index 0000000000..38bebf4e1b
--- /dev/null
+++ b/Zend/tests/closure_write_prop.phpt
@@ -0,0 +1,22 @@
+--TEST--
+Cannot write to closure properties
+--FILE--
+<?php
+
+class A {
+ function getFn() {
+ return function() {
+ };
+ }
+}
+
+$a = new A;
+try {
+ $c = $a->getFn()->b = new stdClass;
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
+
+?>
+--EXPECT--
+Closure object cannot have properties
diff --git a/Zend/zend_closures.c b/Zend/zend_closures.c
index 697fd69fd6..92f1398d84 100644
--- a/Zend/zend_closures.c
+++ b/Zend/zend_closures.c
@@ -435,7 +435,7 @@ static ZEND_COLD zval *zend_closure_read_property(zval *object, zval *member, in
static ZEND_COLD zval *zend_closure_write_property(zval *object, zval *member, zval *value, void **cache_slot) /* {{{ */
{
ZEND_CLOSURE_PROPERTY_ERROR();
- return value;
+ return &EG(error_zval);
}
/* }}} */