From: Nikita Popov Date: Fri, 15 Nov 2019 11:06:17 +0000 (+0100) Subject: Fixed bug #78810 X-Git-Tag: php-7.4.7RC1~502 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=266f3a02bce4e4c68f93744540c9bfd32516c868;p=php Fixed bug #78810 --- diff --git a/NEWS b/NEWS index 740abaa421..a767481238 100644 --- a/NEWS +++ b/NEWS @@ -1,5 +1,12 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| + +?? ??? ????, PHP 7.4.1 + +- Core: + . Fixed bug #78810 (RW fetches do not throw "uninitialized property" + exception). (Nikita) + ?? ??? ????, PHP 7.4.0RC6 - Core: diff --git a/Zend/tests/bug78810.phpt b/Zend/tests/bug78810.phpt new file mode 100644 index 0000000000..0fd56f0ced --- /dev/null +++ b/Zend/tests/bug78810.phpt @@ -0,0 +1,25 @@ +--TEST-- +Bug #78810: RW fetches do not throw "uninitialized property" exception +--FILE-- +i++; +} catch (Error $e) { + echo $e->getMessage(), "\n"; +} +try { + $test->i += 1; +} catch (Error $e) { + echo $e->getMessage(), "\n"; +} + +?> +--EXPECT-- +Typed property Test::$i must not be accessed before initialization +Typed property Test::$i must not be accessed before initialization diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 5ac64fffb1..3a7b83ed63 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -1044,8 +1044,16 @@ ZEND_API zval *zend_std_get_property_ptr_ptr(zval *object, zval *member, int typ if (EXPECTED(!zobj->ce->__get) || UNEXPECTED((*zend_get_property_guard(zobj, name)) & IN_GET)) { if (UNEXPECTED(type == BP_VAR_RW || type == BP_VAR_R)) { - ZVAL_NULL(retval); - zend_error(E_NOTICE, "Undefined property: %s::$%s", ZSTR_VAL(zobj->ce->name), ZSTR_VAL(name)); + if (UNEXPECTED(prop_info)) { + zend_throw_error(NULL, + "Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(prop_info->ce->name), + ZSTR_VAL(name)); + retval = &EG(error_zval); + } else { + ZVAL_NULL(retval); + zend_error(E_NOTICE, "Undefined property: %s::$%s", ZSTR_VAL(zobj->ce->name), ZSTR_VAL(name)); + } } } else { /* we do have getter - fail and let it try again with usual get/set */