diff options
author | Dmitry Stogov <dmitry@zend.com> | 2021-01-19 11:54:01 +0300 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2021-01-19 11:54:01 +0300 |
commit | c195fcd67894a7589db1696fb42ed517b24eef6b (patch) | |
tree | 2140a97ba3f003391b8a665689d338fdef08ab30 /ext/reflection/php_reflection.c | |
parent | 6a1e74eb323813d183abdaccb0bb504f5979b199 (diff) | |
download | php-git-c195fcd67894a7589db1696fb42ed517b24eef6b.tar.gz |
Avoid modification of trait info
Diffstat (limited to 'ext/reflection/php_reflection.c')
-rw-r--r-- | ext/reflection/php_reflection.c | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 90470acdc2..b0c1067474 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -4913,9 +4913,30 @@ ZEND_METHOD(ReflectionClass, getTraitAliases) zend_trait_method_reference *cur_ref = &ce->trait_aliases[i]->trait_method; if (ce->trait_aliases[i]->alias) { + zend_string *class_name = cur_ref->class_name; + + if (!class_name) { + uint32_t j = 0; + zval *zv; + zend_class_entry *trait; + zend_string *lcname = zend_string_tolower(cur_ref->method_name); + + for (j = 0; j < ce->num_traits; j++) { + zv = zend_hash_find_ex(CG(class_table), ce->trait_names[j].lc_name, 1); + if (zv) { + trait = Z_CE_P(zv); + if (zend_hash_exists(&trait->function_table, lcname)) { + class_name = trait->name; + break; + } + } + } + zend_string_release_ex(lcname, 0); + ZEND_ASSERT(class_name != NULL); + } - mname = zend_string_alloc(ZSTR_LEN(cur_ref->class_name) + ZSTR_LEN(cur_ref->method_name) + 2, 0); - snprintf(ZSTR_VAL(mname), ZSTR_LEN(mname) + 1, "%s::%s", ZSTR_VAL(cur_ref->class_name), ZSTR_VAL(cur_ref->method_name)); + mname = zend_string_alloc(ZSTR_LEN(class_name) + ZSTR_LEN(cur_ref->method_name) + 2, 0); + snprintf(ZSTR_VAL(mname), ZSTR_LEN(mname) + 1, "%s::%s", ZSTR_VAL(class_name), ZSTR_VAL(cur_ref->method_name)); add_assoc_str_ex(return_value, ZSTR_VAL(ce->trait_aliases[i]->alias), ZSTR_LEN(ce->trait_aliases[i]->alias), mname); } i++; |