From 1a22f30187163ce288b14e55a80539353a38b7be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C4=9Bj=20Grabovsk=C3=BD?= Date: Tue, 29 Sep 2020 14:16:00 +0200 Subject: [PATCH 1/2] gui-wizard-gtk: Fix segfault Since show_error_as_msgbox() is specified as the custom logging handler (via setting libreport_g_custom_logger), it will get called if an error occurs in libreport_save_user_settings(). However, at that point, g_wnd_assistant has already been destroyed, which leads to an invalid read in show_error_as_msgbox(). This change unsets the custom logging handler after the GUI is destroyed and adds an assertion in show_error_as_msgbox() checking that g_wnd_assistant is not a null pointer. Resolves https://bugzilla.redhat.com/show_bug.cgi?id=1883337 --- src/gui-wizard-gtk/main.c | 6 ++++-- src/gui-wizard-gtk/wizard.c | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/gui-wizard-gtk/main.c b/src/gui-wizard-gtk/main.c index e111948c..f094c5fb 100644 --- a/src/gui-wizard-gtk/main.c +++ b/src/gui-wizard-gtk/main.c @@ -125,6 +125,7 @@ int main(int argc, char **argv) /* List of events specified on the command line. */ GList *user_event_list = NULL; const char *prgname = "abrt"; + int ret = 0; abrt_init(argv); /* I18n */ @@ -217,13 +218,14 @@ int main(int argc, char **argv) g_signal_connect(app, "startup", G_CALLBACK(startup_wizard), NULL); /* Enter main loop */ - g_application_run(G_APPLICATION(app), argc, argv); + ret = g_application_run(G_APPLICATION(app), argc, argv); g_object_unref(app); + libreport_g_custom_logger = NULL; if (opts & OPT_d) delete_dump_dir_possibly_using_abrtd(g_dump_dir_name); libreport_save_user_settings(); - return 0; + return ret; } diff --git a/src/gui-wizard-gtk/wizard.c b/src/gui-wizard-gtk/wizard.c index 775b709f..c4a0b4c0 100644 --- a/src/gui-wizard-gtk/wizard.c +++ b/src/gui-wizard-gtk/wizard.c @@ -360,6 +360,8 @@ struct dump_dir *wizard_open_directory_for_writing(const char *dump_dir_name) void show_error_as_msgbox(const char *msg) { + g_return_if_fail(g_wnd_assistant != NULL); + GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(g_wnd_assistant), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, -- 2.26.2