From: Bob Weinand Date: Thu, 14 May 2015 15:17:39 +0000 (+0200) Subject: Fix memleak in generators using symtable X-Git-Tag: PRE_PHP7_NSAPI_REMOVAL~42^2~76 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c6a6b9746de0411fb2b352d8d4dfc432cb56eb91;p=php Fix memleak in generators using symtable --- diff --git a/Zend/tests/generators/generator_symtable_leak.phpt b/Zend/tests/generators/generator_symtable_leak.phpt new file mode 100644 index 0000000000..7c736222d0 --- /dev/null +++ b/Zend/tests/generators/generator_symtable_leak.phpt @@ -0,0 +1,20 @@ +--TEST-- +Generators using symtables must not leak +--FILE-- +valid(); + +?> +--EXPECT-- +array(1) { + [0]=> + string(16) "some complex var" +} diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c index e845b2e5f2..706d913f72 100644 --- a/Zend/zend_generators.c +++ b/Zend/zend_generators.c @@ -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));