summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2019-08-17 10:57:26 +0200
committerNikita Popov <nikita.ppv@gmail.com>2019-08-17 10:58:54 +0200
commitbe7e819068985859f92e4af21e49b4f647dd0467 (patch)
tree9c5b0f10549116ce14c54e2e5f04600c3ec66ea7
parenta192499d2a3806bf55aa060539b5ce8580aa5db7 (diff)
downloadphp-git-be7e819068985859f92e4af21e49b4f647dd0467.tar.gz
Fixed bug #77922
In PHP 7.3 shadow properties are no longer duplicated. Make sure we only release them if the property was defined on the parent class, which means that it changed from private->shadow, which is where duplication does happen.
-rw-r--r--NEWS4
-rw-r--r--Zend/tests/bug77922.phpt20
-rw-r--r--Zend/zend_opcode.c3
3 files changed, 26 insertions, 1 deletions
diff --git a/NEWS b/NEWS
index 07bd89152a..9ddf7bcf83 100644
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,10 @@ PHP NEWS
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
?? ??? ????, PHP 7.3.10
+- Core:
+ . Fixed bug #77922 (Double release of doc comment on inherited shadow
+ property). (Nikita)
+
- Intl:
. Ensure IDNA2003 rules are used with idn_to_ascii() and idn_to_utf8()
when requested. (Sara)
diff --git a/Zend/tests/bug77922.phpt b/Zend/tests/bug77922.phpt
new file mode 100644
index 0000000000..2984f4c873
--- /dev/null
+++ b/Zend/tests/bug77922.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Bug #77922: Double release of doc comment on inherited shadow property
+--FILE--
+<?php
+
+class A {
+ /** Foo */
+ private $prop;
+}
+
+class B extends A {
+}
+
+class C extends B {
+}
+
+?>
+===DONE===
+--EXPECT--
+===DONE===
diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c
index cd1525bdab..a7f32de379 100644
--- a/Zend/zend_opcode.c
+++ b/Zend/zend_opcode.c
@@ -235,7 +235,8 @@ ZEND_API void destroy_zend_class(zval *zv)
efree(ce->default_static_members_table);
}
ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop_info) {
- if (prop_info->ce == ce || (prop_info->flags & ZEND_ACC_SHADOW)) {
+ if (prop_info->ce == ce ||
+ ((prop_info->flags & ZEND_ACC_SHADOW) && prop_info->ce == ce->parent)) {
zend_string_release_ex(prop_info->name, 0);
if (prop_info->doc_comment) {
zend_string_release_ex(prop_info->doc_comment, 0);