]> granicus.if.org Git - php/commitdiff
Fix memleak in generators using symtable
authorBob Weinand <bobwei9@hotmail.com>
Thu, 14 May 2015 15:17:39 +0000 (17:17 +0200)
committerBob Weinand <bobwei9@hotmail.com>
Thu, 14 May 2015 15:17:39 +0000 (17:17 +0200)
Zend/tests/generators/generator_symtable_leak.phpt [new file with mode: 0644]
Zend/zend_generators.c

diff --git a/Zend/tests/generators/generator_symtable_leak.phpt b/Zend/tests/generators/generator_symtable_leak.phpt
new file mode 100644 (file)
index 0000000..7c73622
--- /dev/null
@@ -0,0 +1,20 @@
+--TEST--
+Generators using symtables must not leak
+--FILE--
+<?php
+
+function gen() {
+       $bar = ["some complex var"];
+       ${"f"."oo"} = "force symtable usage";
+       var_dump($bar);
+       yield;
+}
+
+gen()->valid();
+
+?>
+--EXPECT--
+array(1) {
+  [0]=>
+  string(16) "some complex var"
+}
index e845b2e5f2fe53aa4e1787be5ca8de3e0b4b3cfc..706d913f72c7506021c327801e622ef19ad1a089 100644 (file)
@@ -104,11 +104,11 @@ ZEND_API void zend_generator_close(zend_generator *generator, zend_bool finished
        if (generator->execute_data) {
                zend_execute_data *execute_data = generator->execute_data;
 
-               if (!execute_data->symbol_table) {
-                       zend_free_compiled_variables(execute_data);
-               } else {
+               if (execute_data->symbol_table) {
                        zend_clean_and_cache_symbol_table(execute_data->symbol_table);
                }
+               /* always free the CV's, in the symtable are only not-free'd IS_INDIRECT's */
+               zend_free_compiled_variables(execute_data);
 
                if (Z_OBJ(execute_data->This)) {
                        OBJ_RELEASE(Z_OBJ(execute_data->This));