GNOME Bugzilla – Bug 697269
gitg-0.2.6: Segfault with GTK+-3.8.0 / glib-2.36.0
Last modified: 2013-04-05 11:25:02 UTC
Created attachment 240608 [details] backtrace.txt I updated to glib-2.36.0 & GTK+ 3.8.0 today and gitg started segfaulting immediately after execution. Backtrace is attached below. I found it segfaults when accessing window->priv->edit_group in gitg_window_set_focus(). gdb shows the data inside window->priv->edit_group is invalid. I traced the changes to the fields in window->priv->edit_group, and discovered: --- GtkBuilder *b = gitg_utils_new_builder ("gitg-ui.xml"); // ... // gitg-window.c:933: Fetch action group window->priv->edit_group = GTK_ACTION_GROUP(gtk_builder_get_object (b, "action_group_menu_edit")); window->priv->repository_group = GTK_ACTION_GROUP(gtk_builder_get_object (b, "action_group_menu_repository")); gtk_builder_connect_signals (b, window); // gitg-window.c:937: At this step the object window->priv->edit_group points to is freed together with the object "b" // Seemingly window->priv->repository_group has the same issue g_object_unref (b); --- So I tried to add a g_object_ref(window->priv->edit_group) call after it fetches window->priv->edit_group, and seemingly it worked, at least I no longer get segfaults. --- gitg/gitg-window.orig.c 2013-04-04 21:27:57.799976736 +0800 +++ gitg/gitg-window.c 2013-04-04 21:29:24.679976110 +0800 @@ -234,6 +234,16 @@ self->priv->hidden_settings = NULL; } + if (self->priv->edit_group) { + g_object_unref(self->priv->edit_group); + self->priv->edit_group = NULL; + } + + if (self->priv->repository_group) { + g_object_unref(self->priv->repository_group); + self->priv->repository_group = NULL; + } + G_OBJECT_CLASS (gitg_window_parent_class)->dispose (object); } @@ -931,7 +941,9 @@ gtk_window_add_accel_group (GTK_WINDOW (window), gtk_ui_manager_get_accel_group (uiman)); window->priv->edit_group = GTK_ACTION_GROUP(gtk_builder_get_object (b, "action_group_menu_edit")); + g_object_ref(window->priv->edit_group); window->priv->repository_group = GTK_ACTION_GROUP(gtk_builder_get_object (b, "action_group_menu_repository")); + g_object_ref(window->priv->repository_group); gtk_builder_connect_signals (b, window); g_object_unref (b);
This problem has been fixed in our software repository. The fix will go into the next software release. Thank you for your bug report.