diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2021-03-19 16:04:16 +0100 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2021-03-19 16:04:47 +0100 |
commit | 5fd2a5b13b6e0bb5261f1032056856c09649c5fa (patch) | |
tree | 43df46d340297075565fd11aa010d96821266764 /Zend | |
parent | 89c61186fffa5caa9554154fdbe13c5ede43d85a (diff) | |
download | php-git-5fd2a5b13b6e0bb5261f1032056856c09649c5fa.tar.gz |
Fix handling of unknown class in trait precedence list
Fixes oss-fuzz #31983.
Diffstat (limited to 'Zend')
-rw-r--r-- | Zend/tests/traits/precedence_unknown_class.phpt | 15 | ||||
-rw-r--r-- | Zend/zend_inheritance.c | 2 |
2 files changed, 16 insertions, 1 deletions
diff --git a/Zend/tests/traits/precedence_unknown_class.phpt b/Zend/tests/traits/precedence_unknown_class.phpt new file mode 100644 index 0000000000..212cba34e4 --- /dev/null +++ b/Zend/tests/traits/precedence_unknown_class.phpt @@ -0,0 +1,15 @@ +--TEST-- +Unknown class in absolute trait precedence reference +--FILE-- +<?php + +trait T {} +class C { + use T { + WrongClass::method insteadof C; + } +} + +?> +--EXPECTF-- +Fatal error: Could not find trait WrongClass in %s on line %d diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index ba2610e6ab..a78a0bd4f7 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -1816,7 +1816,7 @@ static void zend_traits_init_trait_structures(zend_class_entry *ce, zend_class_e lc_trait_name = zend_string_tolower(cur_method_ref->class_name); trait = zend_hash_find_ptr(EG(class_table), lc_trait_name); zend_string_release_ex(lc_trait_name, 0); - if (!trait && !(trait->ce_flags & ZEND_ACC_LINKED)) { + if (!trait || !(trait->ce_flags & ZEND_ACC_LINKED)) { zend_error_noreturn(E_COMPILE_ERROR, "Could not find trait %s", ZSTR_VAL(cur_method_ref->class_name)); } zend_check_trait_usage(ce, trait, traits); |