From 04b92a799ebbebc534a72b85a76a39089d77f3d3 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Tue, 15 May 2012 21:49:24 -0400 Subject: [PATCH] Be more careful when freeing ui manager nodes https://bugzilla.redhat.com//show_bug.cgi?id=812035 has a stacktrace that shows recursion via free_node -> unref -> dispose -> ui manager api which ends in a crash, since we run free_node over the entire tree and it leaves lots of dangling pointers behind. So, better be careful by setting all pointers to NULL after freeing them. --- gtk/gtkuimanager.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/gtk/gtkuimanager.c b/gtk/gtkuimanager.c index bb0137f8b8..c80df7cd3a 100644 --- a/gtk/gtkuimanager.c +++ b/gtk/gtkuimanager.c @@ -1396,17 +1396,16 @@ static gboolean free_node (GNode *node) { Node *info = NODE_INFO (node); - - g_list_free_full (info->uifiles, node_ui_reference_free); - if (info->action) - g_object_unref (info->action); - if (info->proxy) - g_object_unref (info->proxy); - if (info->extra) - g_object_unref (info->extra); - g_free (info->name); + g_list_free_full (info->uifiles, node_ui_reference_free); + info->uifiles = NULL; + + g_clear_object (&info->action); + g_clear_object (&info->proxy); + g_clear_object (&info->extra); + g_clear_pointer (&info->name, g_free); g_slice_free (Node, info); + node->data = NULL; return FALSE; }