]> granicus.if.org Git - php/commitdiff
Fix handling of unknown class in trait precedence list
authorNikita Popov <nikita.ppv@gmail.com>
Fri, 19 Mar 2021 15:04:16 +0000 (16:04 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Fri, 19 Mar 2021 15:04:47 +0000 (16:04 +0100)
Fixes oss-fuzz #31983.

Zend/tests/traits/precedence_unknown_class.phpt [new file with mode: 0644]
Zend/zend_inheritance.c

diff --git a/Zend/tests/traits/precedence_unknown_class.phpt b/Zend/tests/traits/precedence_unknown_class.phpt
new file mode 100644 (file)
index 0000000..212cba3
--- /dev/null
@@ -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
index ba2610e6abf611a2a2975fc71f3961a696ea05d0..a78a0bd4f74c95bfc646266bff0aab2bea168d06 100644 (file)
@@ -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);