From: Antony Dovgal Date: Mon, 16 May 2005 08:55:31 +0000 (+0000) Subject: MFH: fix bug #32742 (segmentation fault when the stream with a wrapper is not closed) X-Git-Tag: php-4.4.0RC1~60 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4c5d775dd1a9bf6e301345a3a93521536ba0ec0b;p=php MFH: fix bug #32742 (segmentation fault when the stream with a wrapper is not closed) --- diff --git a/NEWS b/NEWS index e19846bdaf..1056567d51 100644 --- a/NEWS +++ b/NEWS @@ -16,6 +16,8 @@ PHP 4 NEWS - Fixed bug #32813 (parse_url() does not handle scheme-only urls properly). (Ilia) - Fixed bug #32802 (General cookie overrides more specific cookie). (Ilia) - Fixed bugs #32800, #32830 (ext/odbc: Problems with 64bit systems). (Jani) +- Fixed bug #32742 (segmentation fault when the stream with a wrapper + is not closed). (Tony, Dmitry) - Fixed bug #32730 (ext/crack.c fails to compile with cracklib-2.8.3). (Jani) - Fixed bug #32670 (foreach() does not issue warning on unset array arg). (Ilia) - Fixed bug #32699 (pg_affected_rows() was defined when it was not available). diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index 60ea17b70b..c995c1a8fa 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -1239,11 +1239,10 @@ PHP_RSHUTDOWN_FUNCTION(basic) } STR_FREE(BG(locale_string)); - if (FG(stream_wrappers)) { - zend_hash_destroy(FG(stream_wrappers)); - efree(FG(stream_wrappers)); - FG(stream_wrappers) = NULL; - } + /* + FG(stream_wrappers) are destroyed + during php_request_shutdown() + */ PHP_RSHUTDOWN(fsock) (SHUTDOWN_FUNC_ARGS_PASSTHRU); PHP_RSHUTDOWN(filestat) (SHUTDOWN_FUNC_ARGS_PASSTHRU); diff --git a/main/main.c b/main/main.c index 559e85f70a..8db03b401b 100644 --- a/main/main.c +++ b/main/main.c @@ -1000,6 +1000,10 @@ void php_request_shutdown(void *dummy) sapi_deactivate(TSRMLS_C); } zend_end_try(); + zend_try { + php_shutdown_stream_hashes(TSRMLS_C); + } zend_end_try(); + zend_try { shutdown_memory_manager(CG(unclean_shutdown), 0 TSRMLS_CC); } zend_end_try(); diff --git a/main/php_streams.h b/main/php_streams.h index 52c6f8d886..5b7726c39a 100755 --- a/main/php_streams.h +++ b/main/php_streams.h @@ -526,6 +526,7 @@ PHPAPI int _php_stream_cast(php_stream *stream, int castas, void **ret, int show int php_init_stream_wrappers(int module_number TSRMLS_DC); int php_shutdown_stream_wrappers(int module_number TSRMLS_DC); +void php_shutdown_stream_hashes(TSRMLS_D); PHP_RSHUTDOWN_FUNCTION(streams); PHPAPI int php_register_url_stream_wrapper(char *protocol, php_stream_wrapper *wrapper TSRMLS_DC); diff --git a/main/streams.c b/main/streams.c index 5ff2fed5af..fe3575b805 100755 --- a/main/streams.c +++ b/main/streams.c @@ -2330,6 +2330,15 @@ static void stream_resource_persistent_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC FG(pclose_ret) = php_stream_free(stream, PHP_STREAM_FREE_CLOSE | PHP_STREAM_FREE_RSRC_DTOR); } +void php_shutdown_stream_hashes(TSRMLS_D) +{ + if (FG(stream_wrappers)) { + zend_hash_destroy(FG(stream_wrappers)); + efree(FG(stream_wrappers)); + FG(stream_wrappers) = NULL; + } +} + int php_init_stream_wrappers(int module_number TSRMLS_DC) { le_stream = zend_register_list_destructors_ex(stream_resource_regular_dtor, NULL, "stream", module_number);