Author: kelnos
Date: 2006-08-16 08:44:39 +0000 (Wed, 16 Aug 2006)
New Revision: 22794

Modified:
   xfdesktop/trunk/modules/menu/desktop-menuspec.c
Log:
fix some memleaks (maybe bug 1910) and a possible crash


Modified: xfdesktop/trunk/modules/menu/desktop-menuspec.c
===================================================================
--- xfdesktop/trunk/modules/menu/desktop-menuspec.c     2006-08-16 08:04:39 UTC 
(rev 22793)
+++ xfdesktop/trunk/modules/menu/desktop-menuspec.c     2006-08-16 08:44:39 UTC 
(rev 22794)
@@ -151,7 +151,7 @@
 static void
 tree_add_orphans(gpointer key, gpointer data, gpointer user_data)
 {
-    g_node_append_data(menu_tree, key);
+    g_node_append(menu_tree, data);
 }
 
 static gboolean
@@ -285,6 +285,8 @@
             if(mtsi.foundnode) {
                 if(state->cur_node != menu_tree) {
                     newnode = g_node_copy(mtsi.foundnode);
+                    newnode->data = g_strdup(newnode->data);
+                    
                     if((toplevel && state->cur_node == menu_tree) ||
                             state->cur_node != menu_tree)
                     {
@@ -293,10 +295,10 @@
                     state->cur_node = newnode;
                 } else
                     state->cur_node = mtsi.foundnode;
-                cat_dupe = mtsi.foundnode->data;
+                cat_dupe = g_strdup(mtsi.foundnode->data);
             } else {
                 cat_dupe = g_strdup(state->cur_category);
-                newnode = g_node_new(cat_dupe);
+                newnode = g_node_new(g_strdup(cat_dupe));
                 if(!toplevel && state->cur_node == menu_tree)
                     g_hash_table_insert(cats_orphans, cat_dupe, newnode);
                 else
@@ -355,9 +357,10 @@
                 mtsi.foundnode = NULL;
                 g_node_traverse(menu_tree, G_IN_ORDER, G_TRAVERSE_ALL, -1,
                         menu_tree_find_node, &mtsi);
-                if(mtsi.foundnode)
+                if(mtsi.foundnode) {
                     newnode = g_node_copy(mtsi.foundnode);
-                else
+                    newnode->data = g_strdup(newnode->data);
+                } else
                     newnode = g_node_new(g_strdup(attribute_values[0]));
                 g_node_append(state->cur_node, newnode);
                 g_hash_table_remove(cats_orphans, attribute_values[0]);
@@ -435,7 +438,7 @@
     displayname_to_icon = g_hash_table_new_full(g_str_hash, g_str_equal,
             NULL, (GDestroyNotify)g_free);
     cats_orphans = g_hash_table_new(g_str_hash, g_str_equal);
-    menu_tree = g_node_new("/");
+    menu_tree = g_node_new(g_strdup("/"));
     state.cur_node = menu_tree;
     
     gpcontext = g_markup_parse_context_new(&gmparser, 0, &state, NULL);
@@ -578,6 +581,14 @@
         return NULL;
 }
 
+static gboolean
+menu_tree_free_data(GNode *node,
+                    gpointer data)
+{
+    g_free(node->data);
+    return FALSE;
+}
+
 void
 desktop_menuspec_free() {
     if(cats_hide) {
@@ -597,6 +608,8 @@
         displayname_to_icon = NULL;
     }
     if(menu_tree) {
+        g_node_traverse(menu_tree, G_IN_ORDER, G_TRAVERSE_ALL, -1,
+                        menu_tree_free_data, NULL);
         g_node_destroy(menu_tree);
         menu_tree = NULL;
     }
@@ -608,5 +621,6 @@
     if(!paths)
         return;
     
+    g_ptr_array_foreach(paths, (GFunc)g_free, NULL);
     g_ptr_array_free(paths, TRUE);
 }

_______________________________________________
Xfce4-commits mailing list
Xfce4-commits@xfce.org
http://foo-projects.org/mailman/listinfo/xfce4-commits

Reply via email to