diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index f32c55aaef6fb..f13915c816d37 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -1121,6 +1121,7 @@ static void zend_add_trait_method(zend_class_entry *ce, const char *name, zend_s function_add_ref(fn); new_fn = zend_arena_alloc(&CG(arena), sizeof(zend_op_array)); memcpy(new_fn, fn, sizeof(zend_op_array)); + new_fn->common.fn_flags |= ZEND_ACC_ARENA_ALLOCATED; fn = zend_hash_update_ptr(&ce->function_table, key, new_fn); zend_add_magic_methods(ce, key, fn); } @@ -1181,7 +1182,11 @@ static int zend_traits_copy_functions(zend_string *fnname, zend_function *fn, ze if (exclude_table == NULL || zend_hash_find(exclude_table, fnname) == NULL) { /* is not in hashtable, thus, function is not to be excluded */ - fn_copy = *fn; + if (fn->type == ZEND_INTERNAL_FUNCTION) { + memcpy(&fn_copy, fn, sizeof(zend_internal_function)); + } else { + fn_copy = *fn; + } /* apply aliases which have not alias name, just setting visibility */ if (ce->trait_aliases) {