]> granicus.if.org Git - php/commitdiff
MFH: - Fix leaks with registered shutdown functions.
authorfoobar <sniper@php.net>
Sun, 9 Jan 2005 16:30:15 +0000 (16:30 +0000)
committerfoobar <sniper@php.net>
Sun, 9 Jan 2005 16:30:15 +0000 (16:30 +0000)
ext/standard/basic_functions.c
main/main.c
main/php_main.h

index bca5328ac69243bb458c018553dcfd7f33580d5f..68cbbe96a19f1d124b107fe905514ade5c41d31f 100644 (file)
@@ -2188,14 +2188,21 @@ static int user_tick_function_compare(user_tick_function_entry * tick_fe1, user_
        }
 }
 
-void php_call_shutdown_functions(void)
+void php_call_shutdown_functions(TSRMLS_D)
 {
-       TSRMLS_FETCH();
-
        if (BG(user_shutdown_function_names))
                zend_try {
                        zend_hash_apply(BG(user_shutdown_function_names), (apply_func_t) user_shutdown_function_call TSRMLS_CC);
                        memcpy(&EG(bailout), &orig_bailout, sizeof(jmp_buf));
+                       php_free_shutdown_functions(TSRMLS_C);
+               }
+               zend_end_try();
+}
+
+void php_free_shutdown_functions(TSRMLS_D)
+{
+       if (BG(user_shutdown_function_names))
+               zend_try {
                        zend_hash_destroy(BG(user_shutdown_function_names));
                        FREE_HASHTABLE(BG(user_shutdown_function_names));
                        BG(user_shutdown_function_names) = NULL;
index 125295bf245c6c00b9557945b9437936067635da..5b13943a5d22e20912d5f7efe2d5c4d1d9128eb5 100644 (file)
@@ -1135,11 +1135,12 @@ void php_request_shutdown_for_hook(void *dummy)
 {
        TSRMLS_FETCH();
        if (PG(modules_activated)) zend_try {
-               php_call_shutdown_functions();
+               php_call_shutdown_functions(TSRMLS_C);
        } zend_end_try();
 
        if (PG(modules_activated)) {
                zend_deactivate_modules(TSRMLS_C);
+               php_free_shutdown_functions(TSRMLS_C);
        }
 
        zend_try {
@@ -1191,11 +1192,12 @@ void php_request_shutdown(void *dummy)
        } zend_end_try();
 
        if (PG(modules_activated)) zend_try {
-               php_call_shutdown_functions();
+               php_call_shutdown_functions(TSRMLS_C);
        } zend_end_try();
        
        if (PG(modules_activated)) {
                zend_deactivate_modules(TSRMLS_C);
+               php_free_shutdown_functions(TSRMLS_C);
        }
 
        zend_try {
index 01656e5d24e3d6def8e0bada547525048ca8ecc6..883953643f584eb54c0f9b0d0dc5e5c9e659c80b 100644 (file)
@@ -48,7 +48,8 @@ PHPAPI int php_handle_auth_data(const char *auth TSRMLS_DC);
 
 PHPAPI void php_html_puts(const char *str, uint siz TSRMLS_DC);
 
-extern void php_call_shutdown_functions(void);
+extern void php_call_shutdown_functions(TSRMLS_D);
+extern void php_free_shutdown_functions(TSRMLS_D);
 
 /* environment module */
 extern int php_init_environ(void);