summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2020-09-07 19:06:53 +0200
committerNikita Popov <nikita.ppv@gmail.com>2020-09-07 19:08:04 +0200
commit174dadf6b476a11c72646294700e62fe911366cb (patch)
tree8ab4814f4c9bdecb117499da63c7301f3adeb093
parent628db3f3b5b28190997b3cb2f711b6853c074660 (diff)
downloadphp-git-174dadf6b476a11c72646294700e62fe911366cb.tar.gz
Don't allow dynamic properties on generators
Noticed this because we leak those properties in GC. This was never intended to be allowed.
-rw-r--r--Zend/tests/generators/dynamic_properties.phpt19
-rw-r--r--Zend/zend_generators.c2
2 files changed, 20 insertions, 1 deletions
diff --git a/Zend/tests/generators/dynamic_properties.phpt b/Zend/tests/generators/dynamic_properties.phpt
new file mode 100644
index 0000000000..d42eed914a
--- /dev/null
+++ b/Zend/tests/generators/dynamic_properties.phpt
@@ -0,0 +1,19 @@
+--TEST--
+It's not possible to assign dynamic properties on a generator
+--FILE--
+<?php
+
+function gen() {
+ yield;
+}
+
+$gen = gen();
+try {
+ $gen->prop = 42;
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
+
+?>
+--EXPECT--
+Cannot create dynamic property Generator::$prop
diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c
index 13f06a4c34..cbb0a10d06 100644
--- a/Zend/zend_generators.c
+++ b/Zend/zend_generators.c
@@ -1159,7 +1159,7 @@ void zend_register_generator_ce(void) /* {{{ */
INIT_CLASS_ENTRY(ce, "Generator", class_Generator_methods);
zend_ce_generator = zend_register_internal_class(&ce);
- zend_ce_generator->ce_flags |= ZEND_ACC_FINAL;
+ zend_ce_generator->ce_flags |= ZEND_ACC_FINAL | ZEND_ACC_NO_DYNAMIC_PROPERTIES;
zend_ce_generator->create_object = zend_generator_create;
zend_ce_generator->serialize = zend_class_serialize_deny;
zend_ce_generator->unserialize = zend_class_unserialize_deny;