Skip to content

Commit 62171fd

Browse files
committed
Fix leaking of interface_names when interface count goes to 0
1 parent 2f8405c commit 62171fd

File tree

2 files changed

+26
-2
lines changed

2 files changed

+26
-2
lines changed
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
--TEST--
2+
Optional interface with parent
3+
--FILE--
4+
<?php
5+
6+
interface I {}
7+
class P implements I {}
8+
class C extends P implements ?OptionalInterface {}
9+
10+
?>
11+
===DONE===
12+
--EXPECT--
13+
===DONE===

Zend/zend_inheritance.c

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2238,6 +2238,7 @@ static void zend_do_implement_interfaces(zend_class_entry *ce, zend_class_entry
22382238
zend_string_release_ex(ce->interface_names[i].lc_name, 0);
22392239
}
22402240
efree(ce->interface_names);
2241+
ce->interface_names = NULL;
22412242
}
22422243

22432244
ce->num_interfaces = num_interfaces;
@@ -3640,8 +3641,18 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string
36403641
sizeof(zend_class_entry *) * ce->num_interfaces);
36413642

36423643
zend_do_implement_interfaces(ce, interfaces, num_interface_names);
3643-
} else if (parent && parent->num_interfaces) {
3644-
zend_do_inherit_interfaces(ce, parent);
3644+
} else {
3645+
if (ce->interface_names) {
3646+
for (i = 0; i < num_interface_names; i++) {
3647+
zend_string_release_ex(ce->interface_names[i].name, 0);
3648+
zend_string_release_ex(ce->interface_names[i].lc_name, 0);
3649+
}
3650+
efree(ce->interface_names);
3651+
ce->interface_names = NULL;
3652+
}
3653+
if (parent && parent->num_interfaces) {
3654+
zend_do_inherit_interfaces(ce, parent);
3655+
}
36453656
}
36463657
if (!(ce->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_TRAIT))
36473658
&& (ce->ce_flags & (ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS))

0 commit comments

Comments
 (0)