diff --git a/NEWS b/NEWS index d697dae5ee6..521972251c2 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,10 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? ????, PHP 8.1.26 +- Core: + . Fixed bug GH-12468 (Double-free of doc_comment when overriding static + property via trait). (ilutov) + - DOM: . Fix registerNodeClass with abstract class crashing. (nielsdos) diff --git a/Zend/tests/gh12468_1.phpt b/Zend/tests/gh12468_1.phpt new file mode 100644 index 00000000000..a02a28c3e35 --- /dev/null +++ b/Zend/tests/gh12468_1.phpt @@ -0,0 +1,18 @@ +--TEST-- +GH-12468: Double-free of doc_comment when overriding static property via trait +--FILE-- + +===DONE=== +--EXPECT-- +===DONE=== diff --git a/Zend/tests/gh12468_2.phpt b/Zend/tests/gh12468_2.phpt new file mode 100644 index 00000000000..3097cf532e2 --- /dev/null +++ b/Zend/tests/gh12468_2.phpt @@ -0,0 +1,19 @@ +--TEST-- +GH-12468: Double-free of doc_comment when overriding static property via trait +--FILE-- + +===DONE=== +--EXPECT-- +===DONE=== diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 11781330466..5e89c918286 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -4120,7 +4120,7 @@ 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_static_members_table[property_info->offset]); - if (property_info_ptr->doc_comment) { + if (property_info_ptr->doc_comment && property_info_ptr->ce == ce) { zend_string_release(property_info_ptr->doc_comment); } zend_hash_del(&ce->properties_info, name); @@ -4145,7 +4145,7 @@ 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) { + if (property_info_ptr->doc_comment && property_info_ptr->ce == ce) { zend_string_release_ex(property_info_ptr->doc_comment, 1); } zend_hash_del(&ce->properties_info, name);