From c6a6b9746de0411fb2b352d8d4dfc432cb56eb91 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Thu, 14 May 2015 17:17:39 +0200 Subject: [PATCH] Fix memleak in generators using symtable --- .../generators/generator_symtable_leak.phpt | 20 +++++++++++++++++++ Zend/zend_generators.c | 6 +++--- 2 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 Zend/tests/generators/generator_symtable_leak.phpt 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)); -- 2.49.0