From d6c527830e57c85356916e2efc2e6f120d493051 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Wed, 11 Nov 2015 11:33:32 +0800 Subject: [PATCH] Fixed bug #70249 (Segmentation fault while running PHPUnit tests on phpBB 3.2-dev) Maybe we should introduce a new zend_hash_safe_apply which always reload the ht->arData to make sure won't segfault the ht is grew? --- NEWS | 4 +++ ext/standard/basic_functions.c | 13 +++++++-- .../tests/general_functions/bug70249.phpt | 28 +++++++++++++++++++ 3 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 ext/standard/tests/general_functions/bug70249.phpt diff --git a/NEWS b/NEWS index 6a88338f6e..3ebc7de1e7 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,10 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 2015, PHP 7.0.1 +- Standard: + . Fixed bug #70249 (Segmentation fault while running PHPUnit tests on + phpBB 3.2-dev). (Laruence) + - Streams/Socket . Add IPV6_V6ONLY constant / make it usable in stream contexts. (Bob) diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index 8da45c4287..1c5f3fe988 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -5002,9 +5002,16 @@ PHPAPI void php_call_shutdown_functions(void) /* {{{ */ { if (BG(user_shutdown_function_names)) { zend_try { - zend_hash_apply(BG(user_shutdown_function_names), user_shutdown_function_call); - } - zend_end_try(); + zval *entry; + for (zend_hash_internal_pointer_reset(BG(user_shutdown_function_names)); + zend_hash_has_more_elements(BG(user_shutdown_function_names)) == SUCCESS; + zend_hash_move_forward(BG(user_shutdown_function_names))) { + if ((entry = zend_hash_get_current_data(BG(user_shutdown_function_names))) == NULL) { + continue; + } + user_shutdown_function_call(entry); + } + } zend_end_try(); php_free_shutdown_functions(); } } diff --git a/ext/standard/tests/general_functions/bug70249.phpt b/ext/standard/tests/general_functions/bug70249.phpt new file mode 100644 index 0000000000..aed8dccee3 --- /dev/null +++ b/ext/standard/tests/general_functions/bug70249.phpt @@ -0,0 +1,28 @@ +--TEST-- +Bug #70249 (Segmentation fault while running PHPUnit tests on phpBB 3.2-dev) +--FILE-- +flush(); + // make sure log entries written by shutdown functions are also flushed + // ensure "flush()" is called last when there are multiple shutdown functions + register_shutdown_function([$this, 'flush'], true); + }); + } + + public function flush($final = false) { + return 1; + } +} + +for ($i = 0; $i < 200; $i++) { + $a = new Logger(); +} +?> +okey +--EXPECT-- +okey -- 2.40.0