[PATCH] Fix various memory leaks

Chris Shoemaker c.shoemaker at cox.net
Thu Feb 10 17:12:39 EST 2005


 * Fix memory leak of xml parser context in sixtp-stack.c, string in
gnc_plugin_file_history, gdkCursor in cursors.c, GtkIconSources in
gnc-icons.c, several strings in gnc-menu-extensions.c, TimeSpec and
strings in test-engine-stuff.c
 * added some constness to gnc_ext_gen_action_name()

Index: src/backend/file/sixtp-stack.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/backend/file/sixtp-stack.c,v
retrieving revision 1.5
diff -u -r1.5 sixtp-stack.c
--- src/backend/file/sixtp-stack.c	24 Dec 2002 02:27:09 -0000	1.5
+++ src/backend/file/sixtp-stack.c	10 Feb 2005 02:10:32 -0000
@@ -181,5 +181,9 @@
 {
     sixtp_stack_frame_destroy(context->top_frame);
     g_slist_free(context->data.stack);
+    context->data.saxParserCtxt->userData = NULL;
+    context->data.saxParserCtxt->sax = NULL;    
+    xmlFreeParserCtxt(context->data.saxParserCtxt);
+    context->data.saxParserCtxt = NULL;
     g_free(context);
 }
Index: src/backend/file/sixtp.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/backend/file/sixtp.c,v
retrieving revision 1.7.4.2
diff -u -r1.7.4.2 sixtp.c
--- src/backend/file/sixtp.c	19 Sep 2003 05:53:06 -0000	1.7.4.2
+++ src/backend/file/sixtp.c	10 Feb 2005 02:10:32 -0000
@@ -729,9 +729,11 @@
                  gpointer global_data,
                  gpointer *parse_result) 
 {
-  xmlParserCtxtPtr context = xmlCreateFileParserCtxt( filename );
-  return sixtp_parse_file_common(sixtp, context, data_for_top_level,
-				 global_data, parse_result);
+    gboolean ret;
+    xmlParserCtxtPtr context = xmlCreateFileParserCtxt( filename );
+    ret = sixtp_parse_file_common(sixtp, context, data_for_top_level,
+                                  global_data, parse_result);
+    return ret;
 }
 
 gboolean
@@ -742,9 +744,11 @@
                    gpointer global_data,
                    gpointer *parse_result) 
 {
-  xmlParserCtxtPtr context = xmlCreateMemoryParserCtxt( bufp, bufsz );
-  return sixtp_parse_file_common(sixtp, context, data_for_top_level,
-				 global_data, parse_result);
+    gboolean ret;
+    xmlParserCtxtPtr context = xmlCreateMemoryParserCtxt( bufp, bufsz );
+    ret = sixtp_parse_file_common(sixtp, context, data_for_top_level,
+                                  global_data, parse_result);
+    return ret;
 }
 
 /***********************************************************************/
Index: src/gnome/gnc-plugin-file-history.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/gnome/Attic/gnc-plugin-file-history.c,v
retrieving revision 1.1.2.4
diff -u -r1.1.2.4 gnc-plugin-file-history.c
--- src/gnome/gnc-plugin-file-history.c	20 Oct 2003 06:12:31 -0000	1.1.2.4
+++ src/gnome/gnc-plugin-file-history.c	10 Feb 2005 02:10:44 -0000
@@ -67,6 +67,7 @@
  *                     Other Functions                      *
  ************************************************************/
 
+/* Caller is responsible for g_free'ing returned memory */
 static gchar *
 gnc_history_generate_label (int index, const gchar *filename)
 {
@@ -131,6 +132,7 @@
 	  label_name = gnc_history_generate_label(i, tmp->data);
 	  g_value_set_string (&label, label_name);
 	  g_object_set_property (G_OBJECT(action), "label", &label);
+          g_value_unset(&label);
 	  g_free(label_name);
 
 	  /* set the filename for the callback function */
Index: src/gnome-utils/cursors.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/gnome-utils/cursors.c,v
retrieving revision 1.1.6.3
diff -u -r1.1.6.3 cursors.c
--- src/gnome-utils/cursors.c	20 Jul 2003 04:42:47 -0000	1.1.6.3
+++ src/gnome-utils/cursors.c	10 Feb 2005 02:10:52 -0000
@@ -71,7 +71,7 @@
   }
 
   if (type != GNC_CURSOR_NORMAL)
-    gdk_cursor_destroy (cursor);
+    gdk_cursor_unref (cursor);
 }
 
 
Index: src/gnome-utils/gnc-icons.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/gnome-utils/Attic/gnc-icons.c,v
retrieving revision 1.1.2.5
diff -u -r1.1.2.5 gnc-icons.c
--- src/gnome-utils/gnc-icons.c	25 Oct 2003 23:52:21 -0000	1.1.2.5
+++ src/gnome-utils/gnc-icons.c	10 Feb 2005 02:10:56 -0000
@@ -44,6 +44,7 @@
 	gtk_icon_source_set_filename (source, fullname1);
 	gtk_icon_source_set_pixbuf (source, pixbuf1);
 	gtk_icon_set_add_source (set, source);
+        gtk_icon_source_free(source);
 
 	source = gtk_icon_source_new ();
 	gtk_icon_source_set_filename (source, fullname2);
@@ -51,6 +52,7 @@
 	gtk_icon_source_set_size (source, GTK_ICON_SIZE_MENU);
 	gtk_icon_source_set_size_wildcarded (source, FALSE);
 	gtk_icon_set_add_source (set, source);
+        gtk_icon_source_free(source);
 
 	/* Add it to the factory */
 	gtk_icon_factory_add (factory, stock, set);
Index: src/gnome-utils/gnc-menu-extensions.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/gnome-utils/gnc-menu-extensions.c,v
retrieving revision 1.9.4.4
diff -u -r1.9.4.4 gnc-menu-extensions.c
--- src/gnome-utils/gnc-menu-extensions.c	7 Jul 2004 04:10:32 -0000	1.9.4.4
+++ src/gnome-utils/gnc-menu-extensions.c	10 Feb 2005 02:10:56 -0000
@@ -586,10 +586,10 @@
 }
 
 static GString*
-gnc_ext_gen_action_name( gchar *name )
+gnc_ext_gen_action_name(const gchar *name )
 {
   //gchar *extName;
-  gchar *extChar;
+  const gchar *extChar;
   GString *actionName;
 
   //extName = gnc_extension_name(extInf);
@@ -625,7 +625,7 @@
         pathElts; pathElts = pathElts->next ) {
     GString *eltActionName;
 
-    eltActionName = gnc_ext_gen_action_name( (gchar*)pathElts->data );
+    eltActionName = gnc_ext_gen_action_name( (const gchar*)pathElts->data );
 
     if ( safe_strcmp( (gchar*)pathElts->data, "Main" ) != 0 )
     {
@@ -649,6 +649,7 @@
   GSList        * l = NULL;
   ExtensionInfo * info;
 
+  ENTER(" ");
   for (l = extension_list; l; l = l->next) {
     info = l->data;
     if ((strcmp(info->window, window) != 0)
@@ -662,17 +663,20 @@
       GString *extActionName;
       GString *extUIPath;
       gchar *docString;
+      char *tmpname;
       GCallback gcb;
       //EggMenuMergeType extType;
 
-      extActionName = gnc_ext_gen_action_name( gnc_extension_name(info) );
+      tmpname = gnc_extension_name( info );
+      extActionName = gnc_ext_gen_action_name( tmpname );
       extUIPath = gnc_ext_gen_ui_path( info );
       docString = gnc_extension_documentation( info );
 
       DEBUG( "extension [%s]: %s / %s [%s]\n",
-             gnc_extension_name( info ),
+             tmpname,
              extUIPath->str, extActionName->str,
              docString );
+      g_free(tmpname);
 
       //gnc_extension_path( info->extension, (char**)&windowTmp, (char**)&pathTmp );
       /*printf( "extension [%s] path: %s:%s\n",
@@ -707,6 +711,7 @@
         egg_action_group_add_actions( eag, newEntry, G_N_ELEMENTS (newEntry), info );
         egg_menu_merge_insert_action_group( uiMerge, eag, 0 );
         new_merge_id = egg_menu_merge_new_merge_id( uiMerge );
+        g_free(docString);
 
         {
           gchar *typeStr;
@@ -735,8 +740,11 @@
         egg_menu_merge_ensure_update( uiMerge );
         
       }
+      g_string_free(extActionName, TRUE);
+      g_string_free(extUIPath, TRUE);
     }
-  }
+  } /* end of for loop */
+  LEAVE(" ");
 }
 
 #if 0 /* re-add */
Index: src/engine/test-core/test-engine-stuff.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/test-core/test-engine-stuff.c,v
retrieving revision 1.52.4.10
diff -u -r1.52.4.10 test-engine-stuff.c
--- src/engine/test-core/test-engine-stuff.c	30 Dec 2004 21:37:23 -0000	1.52.4.10
+++ src/engine/test-core/test-engine-stuff.c	10 Feb 2005 05:06:55 -0000
@@ -271,6 +271,7 @@
 get_random_kvp_value_depth (int type, gint depth)
 {
     int datype = type;
+    KvpValue *ret;
 
     if (datype == -1)
     {
@@ -294,82 +295,74 @@
     switch(datype)
     {
     case KVP_TYPE_GINT64:
-        return kvp_value_new_gint64(get_random_gint64());
+        ret = kvp_value_new_gint64(get_random_gint64());
         break;
 
     case KVP_TYPE_DOUBLE:
-        return NULL;
+        ret = NULL;
         break;
 
     case KVP_TYPE_NUMERIC:
-        return kvp_value_new_gnc_numeric(get_random_gnc_numeric());
+        ret = kvp_value_new_gnc_numeric(get_random_gnc_numeric());
         break;
 
     case KVP_TYPE_STRING:
     {
         gchar *tmp_str;
-        KvpValue *ret;
         tmp_str = get_random_string();
         if(!tmp_str)
-        {
-            return NULL;
-        }
+	  return NULL;
         
         ret = kvp_value_new_string(tmp_str);
         g_free(tmp_str);
-        return ret;
     }
         break;
 
     case KVP_TYPE_GUID:
     {
         GUID *tmp_guid;
-        KvpValue *ret;
         tmp_guid = get_random_guid();
         ret = kvp_value_new_guid(tmp_guid);
         g_free(tmp_guid);
-        return ret;
     }
         break;
 
     case KVP_TYPE_TIMESPEC:
     {
         Timespec *ts = get_random_timespec();
-        return kvp_value_new_timespec (*ts);
+        ret = kvp_value_new_timespec (*ts);
+        g_free(ts);
     }
 	break;
     
     case KVP_TYPE_BINARY:
     {
         bin_data *tmp_data;
-        KvpValue *ret;
         tmp_data = get_random_binary_data();
         ret = kvp_value_new_binary(tmp_data->data, tmp_data->len);
         g_free(tmp_data->data);
         g_free(tmp_data);
-        return ret;
     }
         break;
  
     case KVP_TYPE_GLIST:
-        return kvp_value_new_glist_nc(get_random_glist_depth (depth + 1));
+        ret = kvp_value_new_glist_nc(get_random_glist_depth (depth + 1));
         break;
 
     case KVP_TYPE_FRAME:
     {
         KvpFrame *tmp_frame;
-        KvpValue *ret;
         tmp_frame = get_random_kvp_frame_depth(depth + 1);
         ret = kvp_value_new_frame(tmp_frame);
         kvp_frame_delete(tmp_frame);
-        return ret;
     }
         break;
 
     default:
-        return NULL;
+        ret = NULL;
         break;
     }
+    return ret;
 }
 
 static KvpFrame*
@@ -392,14 +385,19 @@
         gchar *key;
         KvpValue *val;
 
-        do
-        {
-          key = get_random_string_without("/");
-        } while (!key || *key == '\0');
-
+	key = NULL;
+	while (key == NULL) {
+	  key = get_random_string_without("/");
+	  if (*key == '\0') {
+	    g_free(key);
+	    key = NULL;
+	  }
+	}
+	
         val = get_random_kvp_value_depth (-1, depth + 1);
         if (!val)
         {
+	  g_free(key);
           if (!val_added)
             vals_to_add++;
           continue;


More information about the gnucash-patches mailing list