From cd34fc9230945d7729f801e21b76387e86f74365 Mon Sep 17 00:00:00 2001 From: Florian Sowade Date: Mon, 18 Sep 2023 14:28:39 +0200 Subject: [PATCH 1/3] Fix memory leak of doc blocks of static properties When declaring the same static property with a doc block in a class and in a trait, the doc block of the property in the class is leaked. This fixes #12207. --- ...idding-static-property-with-doc-block.phpt | 20 +++++++++++++++++++ Zend/zend_API.c | 6 ++++++ 2 files changed, 26 insertions(+) create mode 100644 Zend/tests/traits/bugs/overridding-static-property-with-doc-block.phpt diff --git a/Zend/tests/traits/bugs/overridding-static-property-with-doc-block.phpt b/Zend/tests/traits/bugs/overridding-static-property-with-doc-block.phpt new file mode 100644 index 0000000000000..bc78a48f5c308 --- /dev/null +++ b/Zend/tests/traits/bugs/overridding-static-property-with-doc-block.phpt @@ -0,0 +1,20 @@ +--TEST-- +Overriding a static property where both declarations have a doc block does not leak memory +--FILE-- +flags & ZEND_ACC_STATIC) != 0) { property_info->offset = property_info_ptr->offset; zval_ptr_dtor(&ce->default_static_members_table[property_info->offset]); + if (property_info_ptr->doc_comment) { + zend_string_release(property_info_ptr->doc_comment); + } zend_hash_del(&ce->properties_info, name); } else { property_info->offset = ce->default_static_members_count++; @@ -4350,6 +4353,9 @@ ZEND_API zend_property_info *zend_declare_typed_property(zend_class_entry *ce, z (property_info_ptr->flags & ZEND_ACC_STATIC) == 0) { property_info->offset = property_info_ptr->offset; zval_ptr_dtor(&ce->default_properties_table[OBJ_PROP_TO_NUM(property_info->offset)]); + if (property_info_ptr->doc_comment) { + zend_string_release_ex(property_info_ptr->doc_comment, 1); + } zend_hash_del(&ce->properties_info, name); ZEND_ASSERT(ce->type == ZEND_INTERNAL_CLASS); From 29afa0735f396e272e975e5a02253911e699fd3f Mon Sep 17 00:00:00 2001 From: Florian Sowade Date: Mon, 18 Sep 2023 15:03:27 +0200 Subject: [PATCH 2/3] Close php tag in .phpt file --- .../traits/bugs/overridding-static-property-with-doc-block.phpt | 1 + 1 file changed, 1 insertion(+) diff --git a/Zend/tests/traits/bugs/overridding-static-property-with-doc-block.phpt b/Zend/tests/traits/bugs/overridding-static-property-with-doc-block.phpt index bc78a48f5c308..51c733d662533 100644 --- a/Zend/tests/traits/bugs/overridding-static-property-with-doc-block.phpt +++ b/Zend/tests/traits/bugs/overridding-static-property-with-doc-block.phpt @@ -17,4 +17,5 @@ class MyClass { */ static $property; } +?> --EXPECT-- From bf6cb2518f05c245462284709e291ed95961aaab Mon Sep 17 00:00:00 2001 From: Florian Sowade Date: Mon, 18 Sep 2023 15:22:14 +0200 Subject: [PATCH 3/3] Fix indentation --- Zend/zend_API.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index d52c3e7155005..30bd901d8e233 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -4353,9 +4353,9 @@ ZEND_API zend_property_info *zend_declare_typed_property(zend_class_entry *ce, z (property_info_ptr->flags & ZEND_ACC_STATIC) == 0) { property_info->offset = property_info_ptr->offset; zval_ptr_dtor(&ce->default_properties_table[OBJ_PROP_TO_NUM(property_info->offset)]); - if (property_info_ptr->doc_comment) { - zend_string_release_ex(property_info_ptr->doc_comment, 1); - } + if (property_info_ptr->doc_comment) { + zend_string_release_ex(property_info_ptr->doc_comment, 1); + } zend_hash_del(&ce->properties_info, name); ZEND_ASSERT(ce->type == ZEND_INTERNAL_CLASS);