diff --git a/ext/zend_test/test.c b/ext/zend_test/test.c index 33dbc36f553..4b0764ffd99 100644 --- a/ext/zend_test/test.c +++ b/ext/zend_test/test.c @@ -1114,9 +1114,12 @@ static ZEND_METHOD(_ZendTestMagicCallForward, __call) ZEND_IGNORE_VALUE(arguments); - zval func; + zval func, rv; ZVAL_STR(&func, name); - call_user_function(NULL, NULL, &func, return_value, 0, NULL); + call_user_function(NULL, NULL, &func, &rv, 0, NULL); + + ZVAL_COPY_DEREF(return_value, &rv); + zval_ptr_dtor(&rv); } PHP_INI_BEGIN() diff --git a/ext/zend_test/tests/gh16908.phpt b/ext/zend_test/tests/gh16908.phpt new file mode 100644 index 00000000000..670cfa579a8 --- /dev/null +++ b/ext/zend_test/tests/gh16908.phpt @@ -0,0 +1,20 @@ +--TEST-- +GH-16908 (_ZendTestMagicCallForward does not handle references well) +--EXTENSIONS-- +zend_test +--FILE-- +foo()->x ??= 42; +?> +--EXPECTF-- +Notice: Only variable references should be returned by reference in %s on line %d + +Notice: Only variable references should be returned by reference in %s on line %d + +Fatal error: Uncaught Error: Attempt to assign property "x" on null in %s:%d +Stack trace: +#0 {main} + thrown in %s on line %d