]> granicus.if.org Git - php/commitdiff
Fixed incorrect ZEND_ACC_ARENA_ALLOCATED usage (it must be used only for internal...
authorDmitry Stogov <dmitry@zend.com>
Wed, 29 Aug 2018 20:40:17 +0000 (23:40 +0300)
committerDmitry Stogov <dmitry@zend.com>
Wed, 29 Aug 2018 20:40:17 +0000 (23:40 +0300)
Zend/zend_inheritance.c

index 16c8f9d6591bb13e1c7c67bf25705d1319fe7f44..b0c1f0ac37e2a4507b7e8042914b726bc85be242 100644 (file)
@@ -1224,10 +1224,15 @@ 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;
+       if (UNEXPECTED(fn->type == ZEND_INTERNAL_FUNCTION)) {
+               new_fn = zend_arena_alloc(&CG(arena), sizeof(zend_internal_function));
+               memcpy(new_fn, fn, sizeof(zend_internal_function));
+               new_fn->common.fn_flags |= ZEND_ACC_ARENA_ALLOCATED;
+       } else {
+               function_add_ref(fn);
+               new_fn = zend_arena_alloc(&CG(arena), sizeof(zend_op_array));
+               memcpy(new_fn, fn, sizeof(zend_op_array));
+       }
        fn = zend_hash_update_ptr(&ce->function_table, key, new_fn);
        zend_add_magic_methods(ce, key, fn);
 }