From eaa1b3e6142b8aa5ac2081884ff52a853d68284a Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Thu, 5 Mar 2015 00:44:47 -0800 Subject: [PATCH 1/3] This test fails with multibyte on because it spews a conversion error on the bogus file --- ext/phar/tests/zip/notphar.phpt | 1 + 1 file changed, 1 insertion(+) diff --git a/ext/phar/tests/zip/notphar.phpt b/ext/phar/tests/zip/notphar.phpt index c0648c49534..ab4ff52e1ef 100644 --- a/ext/phar/tests/zip/notphar.phpt +++ b/ext/phar/tests/zip/notphar.phpt @@ -5,6 +5,7 @@ Phar: a non-executable zip with no stub named .phar.zip --INI-- phar.readonly=1 detect_unicode=0 +zend.multibyte=0 --FILE-- Date: Thu, 5 Mar 2015 18:16:39 +0800 Subject: [PATCH 2/3] Fixed bug #69174 (leaks when unused inner class use traits precedence) --- NEWS | 2 ++ Zend/tests/bug69174.phpt | 16 ++++++++++++++++ Zend/zend_compile.c | 17 ++++++++++++++++- Zend/zend_opcode.c | 7 ++++++- Zend/zend_signal.c | 8 ++++---- 5 files changed, 44 insertions(+), 6 deletions(-) create mode 100644 Zend/tests/bug69174.phpt diff --git a/NEWS b/NEWS index 5eec926c32c..2c66055e423 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,8 @@ PHP NEWS ?? ??? 2015, PHP 5.5.23 - Core: + . Fixed bug #69174 (leaks when unused inner class use traits precedence). + (Laruence) . Fixed bug #69139 (Crash in gc_zval_possible_root on unserialize). (Laruence) . Fixed bug #69121 (Segfault in get_current_user when script owner is not diff --git a/Zend/tests/bug69174.phpt b/Zend/tests/bug69174.phpt new file mode 100644 index 00000000000..eec0957470a --- /dev/null +++ b/Zend/tests/bug69174.phpt @@ -0,0 +1,16 @@ +--TEST-- +Bug #69174 (leaks when unused inner class use traits precedence) +--FILE-- + +==DONE== +--EXPECT-- +==DONE== diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 1b0ba89eff5..edd45bfccc9 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -4204,16 +4204,20 @@ static void zend_do_traits_method_binding(zend_class_entry *ce TSRMLS_DC) /* {{{ for (i = 0; i < ce->num_traits; i++) { if (ce->trait_precedences) { HashTable exclude_table; + zend_trait_precedence **precedences; /* TODO: revisit this start size, may be its not optimal */ zend_hash_init_ex(&exclude_table, 2, NULL, NULL, 0, 0); - zend_traits_compile_exclude_table(&exclude_table, ce->trait_precedences, ce->traits[i]); + precedences = ce->trait_precedences; + ce->trait_precedences = NULL; + zend_traits_compile_exclude_table(&exclude_table, precedences, ce->traits[i]); /* copies functions, applies defined aliasing, and excludes unused trait methods */ zend_hash_apply_with_arguments(&ce->traits[i]->function_table TSRMLS_CC, (apply_func_args_t)zend_traits_copy_functions, 3, ce, &overriden, &exclude_table); zend_hash_destroy(&exclude_table); + ce->trait_precedences = precedences; } else { zend_hash_apply_with_arguments(&ce->traits[i]->function_table TSRMLS_CC, (apply_func_args_t)zend_traits_copy_functions, 3, ce, &overriden, NULL); } @@ -4221,6 +4225,17 @@ static void zend_do_traits_method_binding(zend_class_entry *ce TSRMLS_DC) /* {{{ zend_hash_apply_with_argument(&ce->function_table, (apply_func_arg_t)zend_fixup_trait_method, ce TSRMLS_CC); + if (ce->trait_precedences) { + i = 0; + while (ce->trait_precedences[i]) { + if (ce->trait_precedences[i]->exclude_from_classes) { + efree(ce->trait_precedences[i]->exclude_from_classes); + ce->trait_precedences[i]->exclude_from_classes = NULL; + } + i++; + } + } + if (overriden) { zend_hash_destroy(overriden); FREE_HASHTABLE(overriden); diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c index e03cf3073ea..b8e850d629d 100644 --- a/Zend/zend_opcode.c +++ b/Zend/zend_opcode.c @@ -256,9 +256,14 @@ void _destroy_zend_class_traits_info(zend_class_entry *ce) efree(ce->trait_precedences[i]->trait_method); if (ce->trait_precedences[i]->exclude_from_classes) { + zend_uint j = 0; + zend_trait_precedence *cur_precedence = ce->trait_precedences[i]; + while (cur_precedence->exclude_from_classes[j]) { + efree(cur_precedence->exclude_from_classes[j]); + j++; + } efree(ce->trait_precedences[i]->exclude_from_classes); } - efree(ce->trait_precedences[i]); i++; } diff --git a/Zend/zend_signal.c b/Zend/zend_signal.c index 6105fb11193..3e0ce642136 100644 --- a/Zend/zend_signal.c +++ b/Zend/zend_signal.c @@ -78,8 +78,8 @@ void zend_signal_handler_defer(int signo, siginfo_t *siginfo, void *context) if (SIGG(active)) { if (SIGG(depth) == 0) { /* try to handle signal */ - if (SIGG(blocked) != -1) { /* inverse */ - SIGG(blocked) = -1; /* signal is not blocked */ + if (SIGG(blocked) != 0) { /* inverse */ + SIGG(blocked) = 0; /* signal is not blocked */ } if (SIGG(running) == 0) { SIGG(running) = 1; @@ -99,7 +99,7 @@ void zend_signal_handler_defer(int signo, siginfo_t *siginfo, void *context) SIGG(running) = 0; } } else { /* delay signal handling */ - SIGG(blocked) = 0; /* signal is blocked */ + SIGG(blocked) = 1; /* signal is blocked */ if ((queue = SIGG(pavail))) { /* if none available it's simply forgotton */ SIGG(pavail) = queue->next; @@ -314,7 +314,7 @@ void zend_signal_deactivate(TSRMLS_D) SIGNAL_BEGIN_CRITICAL(); SIGG(active) = 0; SIGG(running) = 0; - SIGG(blocked) = -1; + SIGG(blocked) = 0; SIGG(depth) = 0; SIGNAL_END_CRITICAL(); } From 56f9dc2d5902b9ae60da369fec449902f8dafa9e Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Thu, 5 Mar 2015 18:40:25 +0800 Subject: [PATCH 3/3] Update NEWs --- NEWS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS b/NEWS index 993b1f27a5b..fa788891462 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,8 @@ ?? Feb 2015, PHP 5.6.7 - Core: + . Fixed bug #69174 (leaks when unused inner class use traits precedence). + (Laruence) . Fixed bug #69139 (Crash in gc_zval_possible_root on unserialize). (Laruence) . Fixed bug #69121 (Segfault in get_current_user when script owner is not