gnome-vfs code freeze break request



Hi,

I'd like to commit the attached patch to gnome-vfs, but this breaks the
code freeze.
It modifies eggdesktopentries.c and gnome-vfs-mime-info-cache.c

The eggdesktopentries.c changes have been reviewed by Ray Strode and are
already in libegg. This fixes a pretty big leak (100KB on my system on a
simple test program) each time a mimeinfo.cache file is (re)loaded.

The gnome-vfs-mime-info-cache.c changes fix a memory cleanup issue which
made gnome-vfs try to access freed memory under some conditions, this
fixes bug #150467.

Christophe

Index: libgnomevfs/gnome-vfs-mime-info-cache.c
===================================================================
RCS file: /cvs/gnome/gnome-vfs/libgnomevfs/gnome-vfs-mime-info-cache.c,v
retrieving revision 1.4
diff -u -r1.4 gnome-vfs-mime-info-cache.c
--- libgnomevfs/gnome-vfs-mime-info-cache.c	17 Aug 2004 20:26:24 -0000	1.4
+++ libgnomevfs/gnome-vfs-mime-info-cache.c	3 Sep 2004 08:52:00 -0000
@@ -33,6 +33,7 @@
 #include "gnome-vfs-mime-monitor.h"
 #include "gnome-vfs-monitor.h"
 #include "gnome-vfs-ops.h"
+#include "gnome-vfs-utils.h"
 #include "eggdesktopentries.h"
 #include "eggdirfuncs.h"
 
@@ -56,7 +57,6 @@
 
 extern void _gnome_vfs_mime_monitor_emit_data_changed (GnomeVFSMIMEMonitor *monitor); 
 
-static void free_mime_info_cache_map_list (GList *list);
 static void gnome_vfs_mime_info_cache_dir_init (GnomeVFSMimeInfoCacheDir *dir);
 static void gnome_vfs_mime_info_cache_dir_init_defaults_list (GnomeVFSMimeInfoCacheDir *dir);
 static GnomeVFSMimeInfoCacheDir *gnome_vfs_mime_info_cache_dir_new (const char *path);
@@ -76,11 +76,19 @@
 static GnomeVFSMimeInfoCache *mime_info_cache = NULL;
 G_LOCK_DEFINE_STATIC (mime_info_cache);
 
+
+static void
+destroy_info_cache_value (gpointer key, GList *value, gpointer data)
+{
+	gnome_vfs_list_deep_free (value);
+}
+
 static void
-free_mime_info_cache_map_list (GList *list)
+destroy_info_cache_map (GHashTable *info_cache_map)
 {
-	g_list_foreach (list, (GFunc) g_free, NULL);
-	g_list_free (list);
+	g_hash_table_foreach (info_cache_map, (GHFunc)destroy_info_cache_value,
+			      NULL);
+	g_hash_table_destroy (info_cache_map);
 }
 
 static gboolean
@@ -109,7 +117,7 @@
 {
 	EggDesktopEntries *entries;
 	GError *load_error;
-	gchar *filename, **desktop_file_ids, **mime_types;
+	gchar *filename, **mime_types;
 	int i;
 	static gchar *allowed_start_groups[] = { "MIME Cache", NULL };
 	struct stat buf;
@@ -125,12 +133,12 @@
 		return;
 
 	if (dir->mime_info_cache_map != NULL) {
-		g_hash_table_destroy (dir->mime_info_cache_map);
+		destroy_info_cache_map (dir->mime_info_cache_map);
 	}
 
 	dir->mime_info_cache_map = g_hash_table_new_full (g_str_hash, g_str_equal,
 							  (GDestroyNotify) g_free,
-							  (GDestroyNotify) free_mime_info_cache_map_list);
+							  NULL);
 
 	filename = g_build_filename (dir->path, "mimeinfo.cache", NULL);
 
@@ -162,6 +170,7 @@
 		goto error;
 
 	for (i = 0; mime_types[i] != NULL; i++) {
+		gchar **desktop_file_ids;
 		desktop_file_ids = egg_desktop_entries_get_string_list (entries,
 									"MIME Cache",
 									mime_types[i],
@@ -365,7 +374,7 @@
 	if (dir == NULL)
 		return;
 	if (dir->mime_info_cache_map != NULL) {
-		g_hash_table_destroy (dir->mime_info_cache_map);
+		destroy_info_cache_map (dir->mime_info_cache_map);
 		dir->mime_info_cache_map = NULL;
 
 	}
Index: libgnomevfs/eggdesktopentries.c
===================================================================
RCS file: /cvs/gnome/gnome-vfs/libgnomevfs/eggdesktopentries.c,v
retrieving revision 1.7
diff -u -r1.7 eggdesktopentries.c
--- libgnomevfs/eggdesktopentries.c	18 Aug 2004 13:25:55 -0000	1.7
+++ libgnomevfs/eggdesktopentries.c	3 Sep 2004 08:52:01 -0000
@@ -409,6 +409,9 @@
   if (entries->parse_buffer)
     g_string_free (entries->parse_buffer, TRUE);
 
+  g_strfreev (entries->legal_start_groups);
+  g_free (entries->default_group_name);
+
   tmp = entries->groups;
   while (tmp != NULL)
     {
@@ -600,10 +603,7 @@
   entry = g_new0 (EggDesktopEntry, 1);
 
   entry->key = NULL;
-
-  entry->value = g_new (char, length + 1);
-  strncpy (entry->value, line, length);
-  entry->value[length] = '\0';
+  entry->value = g_strndup (line, length);
     
   entries->current_group->entries = g_list_prepend (entries->current_group->entries, entry);
 }
@@ -1703,6 +1703,18 @@
   entries->current_group = group;
 }
 
+
+static void 
+entry_free (EggDesktopEntry *entry) 
+{
+  if (entry != NULL)
+    {
+      g_free (entry->key);
+      g_free (entry->value);
+      g_free (entry);
+    }
+}
+
 static void
 egg_desktop_entries_remove_group_node (EggDesktopEntries      *entries,
 				       GList                  *group_node)
@@ -1730,7 +1742,7 @@
 
   g_free ((gchar *) group->name);
 
-  g_list_foreach (group->entries, (GFunc) g_free, NULL);
+  g_list_foreach (group->entries, (GFunc) entry_free, NULL);
   g_list_free (group->entries);
   group->entries = NULL;
 

Attachment: signature.asc
Description: Ceci est une partie de message =?ISO-8859-1?Q?num=E9riquement?= =?ISO-8859-1?Q?_sign=E9e?=



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]