Skip to content

Commit c7f1ab8

Browse files
committed
Fix leak of backed_enum_table with preloading
1 parent fe71a95 commit c7f1ab8

File tree

2 files changed

+8
-0
lines changed

2 files changed

+8
-0
lines changed

Zend/zend_enum.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ void zend_enum_add_interfaces(zend_class_entry *ce)
187187
zend_result zend_enum_build_backed_enum_table(zend_class_entry *ce)
188188
{
189189
ZEND_ASSERT(ce->ce_flags & ZEND_ACC_ENUM);
190+
ZEND_ASSERT(!(ce->ce_flags & ZEND_ACC_IMMUTABLE));
190191
ZEND_ASSERT(ce->type == ZEND_USER_CLASS);
191192

192193
uint32_t backing_type = ce->enum_backing_type;
@@ -495,6 +496,7 @@ ZEND_API zend_class_entry *zend_register_internal_enum(
495496
ce->ce_flags |= ZEND_ACC_ENUM;
496497
ce->enum_backing_type = type;
497498
if (type != IS_UNDEF) {
499+
ZEND_ASSERT(!(ce->ce_flags & ZEND_ACC_IMMUTABLE));
498500
ce->backed_enum_table = pemalloc(sizeof(HashTable), 1);
499501
zend_hash_init(ce->backed_enum_table, 0, NULL, ZVAL_PTR_DTOR, 1);
500502
}

Zend/zend_execute_API.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,12 @@ ZEND_API void zend_shutdown_executor_values(bool fast_shutdown)
346346
}
347347
}
348348

349+
if (ce->type == ZEND_USER_CLASS && ce->backed_enum_table) {
350+
ZEND_ASSERT(!(ce->ce_flags & ZEND_ACC_IMMUTABLE));
351+
zend_hash_release(ce->backed_enum_table);
352+
ce->backed_enum_table = NULL;
353+
}
354+
349355
if (ce->ce_flags & ZEND_HAS_STATIC_IN_METHODS) {
350356
zend_op_array *op_array;
351357
ZEND_HASH_MAP_FOREACH_PTR(&ce->function_table, op_array) {

0 commit comments

Comments
 (0)