diff options
-rw-r--r-- | Zend/zend_inheritance.c | 11 | ||||
-rw-r--r-- | ext/opcache/zend_persist.c | 10 |
2 files changed, 14 insertions, 7 deletions
diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index 2ce4df3049..67b8b849e4 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -855,19 +855,22 @@ static void do_inherit_class_constant(zend_string *name, zend_class_constant *pa void zend_build_properties_info_table(zend_class_entry *ce) { zend_property_info **table, *prop; + size_t size; if (ce->default_properties_count == 0) { return; } ZEND_ASSERT(ce->properties_info_table == NULL); + size = sizeof(zend_property_info *) * ce->default_properties_count; if (ce->type == ZEND_USER_CLASS) { - ce->properties_info_table = table = zend_arena_alloc(&CG(arena), - sizeof(zend_property_info *) * ce->default_properties_count); + ce->properties_info_table = table = zend_arena_alloc(&CG(arena), size); } else { - ce->properties_info_table = table = pemalloc( - sizeof(zend_property_info *) * ce->default_properties_count, 1); + ce->properties_info_table = table = pemalloc(size, 1); } + /* Dead slots may be left behind during inheritance. Make sure these are NULLed out. */ + memset(table, 0, size); + if (ce->parent && ce->parent->default_properties_count != 0) { zend_property_info **parent_table = ce->parent->properties_info_table; memcpy( diff --git a/ext/opcache/zend_persist.c b/ext/opcache/zend_persist.c index 1a22f12b4d..ed05872993 100644 --- a/ext/opcache/zend_persist.c +++ b/ext/opcache/zend_persist.c @@ -860,16 +860,20 @@ static void zend_persist_class_entry(zval *zv) int i; size_t size = sizeof(zend_property_info *) * ce->default_properties_count; + ZEND_ASSERT(ce->ce_flags & ZEND_ACC_LINKED); if (ZCG(is_immutable_class)) { - ce->properties_info_table = zend_shared_memdup_put( + ce->properties_info_table = zend_shared_memdup( ce->properties_info_table, size); } else { - ce->properties_info_table = zend_shared_memdup_arena_put( + ce->properties_info_table = zend_shared_memdup_arena( ce->properties_info_table, size); } for (i = 0; i < ce->default_properties_count; i++) { - ce->properties_info_table[i] = zend_shared_alloc_get_xlat_entry(ce->properties_info_table[i]); + if (ce->properties_info_table[i]) { + ce->properties_info_table[i] = zend_shared_alloc_get_xlat_entry( + ce->properties_info_table[i]); + } } } |