summaryrefslogtreecommitdiff
path: root/Zend/zend_API.c
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2019-08-23 16:58:34 +0200
committerNikita Popov <nikita.ppv@gmail.com>2019-08-23 17:00:59 +0200
commit8807889ac280503d5cd1cd05804a6f278a40300e (patch)
tree5777fad0555128755dc62fddd1722bb8f2127a3b /Zend/zend_API.c
parent7910f128e296ef66a660935d652fd568941665fc (diff)
downloadphp-git-8807889ac280503d5cd1cd05804a6f278a40300e.tar.gz
Fix arginfo leak when using disabled_classes
Also remove the hack where scope is set to NULL in order to make free_internal_arg_info work. Instead explicitly call it for class methods. This fixes the asan build for Zend/tests/bug77494.phpt.
Diffstat (limited to 'Zend/zend_API.c')
-rw-r--r--Zend/zend_API.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/Zend/zend_API.c b/Zend/zend_API.c
index 177a5d5b03..89e9c9d849 100644
--- a/Zend/zend_API.c
+++ b/Zend/zend_API.c
@@ -2856,6 +2856,7 @@ ZEND_API int zend_disable_class(char *class_name, size_t class_name_length) /* {
{
zend_class_entry *disabled_class;
zend_string *key;
+ zend_function *fn;
key = zend_string_alloc(class_name_length, 0);
zend_str_tolower_copy(ZSTR_VAL(key), class_name, class_name_length);
@@ -2864,8 +2865,16 @@ ZEND_API int zend_disable_class(char *class_name, size_t class_name_length) /* {
if (!disabled_class) {
return FAILURE;
}
+
INIT_CLASS_ENTRY_INIT_METHODS((*disabled_class), disabled_class_new);
disabled_class->create_object = display_disabled_class;
+
+ ZEND_HASH_FOREACH_PTR(&disabled_class->function_table, fn) {
+ if ((fn->common.fn_flags & (ZEND_ACC_HAS_RETURN_TYPE|ZEND_ACC_HAS_TYPE_HINTS)) &&
+ fn->common.scope == disabled_class) {
+ zend_free_internal_arg_info(&fn->internal_function);
+ }
+ } ZEND_HASH_FOREACH_END();
zend_hash_clean(&disabled_class->function_table);
return SUCCESS;
}