]> granicus.if.org Git - php/commitdiff
Don't allow dynamic properties on generators
authorNikita Popov <nikita.ppv@gmail.com>
Mon, 7 Sep 2020 17:06:53 +0000 (19:06 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Mon, 7 Sep 2020 17:08:04 +0000 (19:08 +0200)
Noticed this because we leak those properties in GC. This was
never intended to be allowed.

Zend/tests/generators/dynamic_properties.phpt [new file with mode: 0644]
Zend/zend_generators.c

diff --git a/Zend/tests/generators/dynamic_properties.phpt b/Zend/tests/generators/dynamic_properties.phpt
new file mode 100644 (file)
index 0000000..d42eed9
--- /dev/null
@@ -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
index 13f06a4c343eaa9e76f1f8290c4fc667916823a2..cbb0a10d06e6296c6f784f9e4f89f9172fae06d8 100644 (file)
@@ -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;