diff options
| author | Nikita Popov <nikita.ppv@gmail.com> | 2019-02-19 10:07:47 +0100 |
|---|---|---|
| committer | Nikita Popov <nikita.ppv@gmail.com> | 2019-02-19 10:07:47 +0100 |
| commit | 1016e3a927165ec571473ee89eab04512c935f21 (patch) | |
| tree | 36206ba7e150fcac97e619819f33265330f18cd8 | |
| parent | 293313cc48d356d90b43503af1a6f2fd013c4b64 (diff) | |
| parent | 12ffee57d6adf38f8dd8b39ea7f7a5e4c462d358 (diff) | |
| download | php-git-1016e3a927165ec571473ee89eab04512c935f21.tar.gz | |
Merge branch 'PHP-7.4'
| -rw-r--r-- | Zend/zend_builtin_functions.c | 3 | ||||
| -rw-r--r-- | ext/reflection/tests/ReflectionClass_isSubclassOf_error2.phpt | 35 |
2 files changed, 37 insertions, 1 deletions
diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index c59b08b583..626cbea6da 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -1715,7 +1715,8 @@ ZEND_FUNCTION(get_declared_classes) ZEND_HASH_FOREACH_STR_KEY_PTR(EG(class_table), key, ce) { if (key && ZSTR_VAL(key)[0] != 0 - && !(ce->ce_flags & (ZEND_ACC_INTERFACE | ZEND_ACC_TRAIT))) { + && !(ce->ce_flags & (ZEND_ACC_INTERFACE | ZEND_ACC_TRAIT)) + && (ce->ce_flags & ZEND_ACC_LINKED)) { copy_class_or_interface_name(return_value, key, ce); } } ZEND_HASH_FOREACH_END(); diff --git a/ext/reflection/tests/ReflectionClass_isSubclassOf_error2.phpt b/ext/reflection/tests/ReflectionClass_isSubclassOf_error2.phpt new file mode 100644 index 0000000000..8671c2500b --- /dev/null +++ b/ext/reflection/tests/ReflectionClass_isSubclassOf_error2.phpt @@ -0,0 +1,35 @@ +--TEST-- +ReflectionClass::isSubclassOf() - fixed crash for unbound anonymous class +--FILE-- +<?php +class X { + public static function main() { + return new class() extends Base {}; + } +} +class Base {} +$check = function () { + $base = Base::class; + foreach (get_declared_classes() as $class) { + if (strpos($class, 'class@anonymous') === false) { + continue; + } + echo "Checking for $class\n"; + flush(); + $rc = new ReflectionClass($class); + var_export($rc->isSubclassOf($base)); + echo "\n"; + } +}; +// Should not show up in get_declared_classes until the anonymous class is bound. +$check(); +echo "After first check\n"; +X::main(); +$check(); +echo "Done\n"; +?> +--EXPECTF-- +After first check +Checking for class@%s +true +Done |
