From 72721d7205e5724178c0e6ff29f32edfcccc8823 Mon Sep 17 00:00:00 2001 From: Sebastien Helleu Date: Tue, 6 May 2008 17:30:13 +0200 Subject: [PATCH] Do not clean all GUI objects when crashing after SIGSEGV (this can cause crash inside crash!) --- src/core/wee-command.c | 2 +- src/core/wee-debug.c | 2 +- src/core/wee-upgrade.c | 2 +- src/core/weechat.c | 2 +- src/gui/curses/gui-curses-main.c | 67 +++++++++++++++++--------------- src/gui/gtk/gui-gtk-main.c | 65 +++++++++++++++++-------------- src/gui/gui-main.h | 2 +- 7 files changed, 76 insertions(+), 66 deletions(-) diff --git a/src/core/wee-command.c b/src/core/wee-command.c index 4ce2393fe..e227c618d 100644 --- a/src/core/wee-command.c +++ b/src/core/wee-command.c @@ -2175,7 +2175,7 @@ command_upgrade (void *data, struct t_gui_buffer *buffer, plugin_end (); /*if (CONFIG_BOOLEAN(config_look_save_on_exit)) (void) config_write (NULL); - gui_main_end (); + gui_main_end (1); fifo_remove (); weechat_log_close (); diff --git a/src/core/wee-debug.c b/src/core/wee-debug.c index e3094c476..7e09b9a90 100644 --- a/src/core/wee-debug.c +++ b/src/core/wee-debug.c @@ -122,7 +122,7 @@ debug_sigsegv () { debug_dump (1); unhook_all (); - gui_main_end (); + gui_main_end (0); string_iconv_fprintf (stderr, "\n"); string_iconv_fprintf (stderr, "*** Very bad! WeeChat is crashing (SIGSEGV received)\n"); diff --git a/src/core/wee-upgrade.c b/src/core/wee-upgrade.c index f1b5380b0..a50619e8f 100644 --- a/src/core/wee-upgrade.c +++ b/src/core/wee-upgrade.c @@ -509,7 +509,7 @@ session_crash (FILE *file, char *message, ...) va_end (argptr); fclose (file); - gui_main_end (); + gui_main_end (0); string_iconv_fprintf (stderr, "Error: %s\n", buf); string_iconv_fprintf (stderr, _("Last operation with session file was at position %ld, " diff --git a/src/core/weechat.c b/src/core/weechat.c index 60628a9d3..6ba8eb4b1 100644 --- a/src/core/weechat.c +++ b/src/core/weechat.c @@ -496,7 +496,7 @@ main (int argc, char *argv[]) plugin_end (); /* end plugin interface(s) */ if (CONFIG_BOOLEAN(config_look_save_on_exit)) (void) config_weechat_write (NULL); /* save WeeChat config file */ - gui_main_end (); /* shut down WeeChat GUI */ + gui_main_end (1); /* shut down WeeChat GUI */ config_file_free_all (); /* free all configuration files */ gui_keyboard_end (); /* end keyboard */ unhook_all (); /* remove all hooks */ diff --git a/src/gui/curses/gui-curses-main.c b/src/gui/curses/gui-curses-main.c index 3578775e8..a0347361b 100644 --- a/src/gui/curses/gui-curses-main.c +++ b/src/gui/curses/gui-curses-main.c @@ -313,41 +313,46 @@ gui_main_loop () /* * gui_main_end: GUI end + * clean_exit is 0 when WeeChat is crashing (we don't clean + * objects because WeeChat can crash again during this cleanup...) */ void -gui_main_end () +gui_main_end (int clean_exit) { - /* remove bar items and bars */ - gui_bar_item_end (); - gui_bar_free_all (); - - /* free clipboard buffer */ - if (gui_input_clipboard) - free (gui_input_clipboard); - - /* delete all windows */ - while (gui_windows) - gui_window_free (gui_windows); - gui_window_tree_free (&gui_windows_tree); - - /* delete all buffers */ - while (gui_buffers) - gui_buffer_close (gui_buffers, 0); - - /* delete global history */ - gui_history_global_free (); - - /* delete infobar messages */ - while (gui_infobar) - gui_infobar_remove (); - - /* reset title */ - if (CONFIG_BOOLEAN(config_look_set_title)) - gui_window_title_reset (); - - /* end color */ - gui_color_end (); + if (clean_exit) + { + /* remove bar items and bars */ + gui_bar_item_end (); + gui_bar_free_all (); + + /* free clipboard buffer */ + if (gui_input_clipboard) + free (gui_input_clipboard); + + /* delete all windows */ + while (gui_windows) + gui_window_free (gui_windows); + gui_window_tree_free (&gui_windows_tree); + + /* delete all buffers */ + while (gui_buffers) + gui_buffer_close (gui_buffers, 0); + + /* delete global history */ + gui_history_global_free (); + + /* delete infobar messages */ + while (gui_infobar) + gui_infobar_remove (); + + /* reset title */ + if (CONFIG_BOOLEAN(config_look_set_title)) + gui_window_title_reset (); + + /* end color */ + gui_color_end (); + } /* end of Curses output */ refresh (); diff --git a/src/gui/gtk/gui-gtk-main.c b/src/gui/gtk/gui-gtk-main.c index d2f216e02..4cdb3ff37 100644 --- a/src/gui/gtk/gui-gtk-main.c +++ b/src/gui/gtk/gui-gtk-main.c @@ -205,40 +205,45 @@ gui_main_loop () /* * gui_main_end: GUI end + * clean_exit is 0 when WeeChat is crashing (we don't clean + * objects because WeeChat can crash again during this cleanup...) */ void -gui_main_end () +gui_main_end (int clean_exit) { struct t_gui_window *ptr_win; - - /* free clipboard buffer */ - if (gui_input_clipboard) - free(gui_input_clipboard); - - /* delete all windows */ - for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window) - { - /* TODO: destroy Gtk widgets */ - } - - /* delete all buffers */ - while (gui_buffers) - gui_buffer_close (gui_buffers, 0); - - /* delete all windows */ - while (gui_windows) - gui_window_free (gui_windows); - gui_window_tree_free (&gui_windows_tree); - - /* delete global history */ - gui_history_global_free (); - - /* delete infobar messages */ - while (gui_infobar) - gui_infobar_remove (); - /* reset title */ - if (CONFIG_BOOLEAN(config_look_set_title)) - gui_window_title_reset (); + if (clean_exit) + { + /* free clipboard buffer */ + if (gui_input_clipboard) + free(gui_input_clipboard); + + /* delete all windows */ + for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window) + { + /* TODO: destroy Gtk widgets */ + } + + /* delete all buffers */ + while (gui_buffers) + gui_buffer_close (gui_buffers, 0); + + /* delete all windows */ + while (gui_windows) + gui_window_free (gui_windows); + gui_window_tree_free (&gui_windows_tree); + + /* delete global history */ + gui_history_global_free (); + + /* delete infobar messages */ + while (gui_infobar) + gui_infobar_remove (); + + /* reset title */ + if (CONFIG_BOOLEAN(config_look_set_title)) + gui_window_title_reset (); + } } diff --git a/src/gui/gui-main.h b/src/gui/gui-main.h index ca694617d..267e37c4b 100644 --- a/src/gui/gui-main.h +++ b/src/gui/gui-main.h @@ -25,6 +25,6 @@ extern void gui_main_loop (); extern void gui_main_pre_init (int *argc, char **argv[]); extern void gui_main_init (); -extern void gui_main_end (); +extern void gui_main_end (int clean_exit); #endif /* gui-main.h */