summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrea Faulds <ajf@ajf.me>2015-11-27 15:06:13 +0000
committerAndrea Faulds <ajf@ajf.me>2015-11-27 15:06:13 +0000
commit8907da99b83204958cb2308ec12aa9e490372150 (patch)
tree833eab06d0f5615fd7daa4cc2d208d2abfa23c4b
parenta347b0be48d892c105198b23868f37a0d4f92dee (diff)
downloadphp-git-8907da99b83204958cb2308ec12aa9e490372150.tar.gz
Set called_scope in Closure::call (fixes bug #70987)
-rw-r--r--Zend/tests/bug70987.phpt15
-rw-r--r--Zend/zend_closures.c1
2 files changed, 16 insertions, 0 deletions
diff --git a/Zend/tests/bug70987.phpt b/Zend/tests/bug70987.phpt
new file mode 100644
index 0000000000..d31a1d2c6e
--- /dev/null
+++ b/Zend/tests/bug70987.phpt
@@ -0,0 +1,15 @@
+--TEST--
+Bug #70987 (static::class within Closure::call() causes segfault)
+--FILE--
+<?php
+
+class foo {}
+$bar = function () {
+ return static::class;
+};
+
+var_dump($bar->call(new foo));
+
+?>
+--EXPECTF--
+string(3) "foo"
diff --git a/Zend/zend_closures.c b/Zend/zend_closures.c
index 76b10e43d3..beca1cef07 100644
--- a/Zend/zend_closures.c
+++ b/Zend/zend_closures.c
@@ -150,6 +150,7 @@ ZEND_METHOD(Closure, call)
fci.param_count = my_param_count;
fci.object = fci_cache.object = newobj;
fci_cache.initialized = 1;
+ fci_cache.called_scope = Z_OBJCE_P(newthis);
if (fci_cache.function_handler->common.fn_flags & ZEND_ACC_GENERATOR) {
zval new_closure;