summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorRichardHitt <rbh00@netcom.com>2012-10-01 12:53:25 -0700
committerRichardHitt <rbh00@netcom.com>2012-10-01 12:53:25 -0700
commit62903cd171acb49ed66056c32edbcc0fd56b07c5 (patch)
treee57f9e30a86786752f8b8434c9f314ad2e49854f
parent9c3ea364836f52ca4bc980282f22240bfd4c51e5 (diff)
Fix memory leak related to url grabbing
-rw-r--r--src/common/cfgfiles.c2
-rw-r--r--src/common/tree.c4
-rw-r--r--src/common/tree.h2
-rw-r--r--src/common/url.c27
4 files changed, 23 insertions, 12 deletions
diff --git a/src/common/cfgfiles.c b/src/common/cfgfiles.c
index e696729e..1f4d250a 100644
--- a/src/common/cfgfiles.c
+++ b/src/common/cfgfiles.c
@@ -744,7 +744,7 @@ load_config (void)
 	prefs.input_tray_priv = prefs.input_tray_hilight = 1;
 	prefs.autodccsend = 2;	/* browse mode */
 	prefs.url_grabber = 1;
-	prefs.url_grabber_limit = 50; /* 0 means unlimited */
+	prefs.url_grabber_limit = 0; /* 0 means unlimited */
 	prefs.text_search_follow = 1;
 #ifdef WIN32
 	prefs.identd = 1;
diff --git a/src/common/tree.c b/src/common/tree.c
index 0a459779..33fe1d41 100644
--- a/src/common/tree.c
+++ b/src/common/tree.c
@@ -150,10 +150,11 @@ tree_find (tree *t, void *key, tree_cmp_func *cmp, void *data, int *pos)
 	return mybsearch (key, &t->array[0], t->elements, cmp, data, pos);
 }
 
-void
+void *
 tree_remove_at_pos (tree *t, int pos)
 {
 	int post_bytes;
+	void *ret = t->array[pos];
 
 	t->elements--;
 	if (pos != t->elements)
@@ -161,6 +162,7 @@ tree_remove_at_pos (tree *t, int pos)
 		post_bytes = (t->elements - pos) * sizeof (void *);
 		memmove (&t->array[pos], &t->array[pos + 1], post_bytes);
 	}
+	return ret;
 }
 
 int
diff --git a/src/common/tree.h b/src/common/tree.h
index 96ab6cdb..44e06672 100644
--- a/src/common/tree.h
+++ b/src/common/tree.h
@@ -10,7 +10,7 @@ tree *tree_new (tree_cmp_func *cmp, void *data);
 void tree_destroy (tree *t);
 void *tree_find (tree *t, void *key, tree_cmp_func *cmp, void *data, int *pos);
 int tree_remove (tree *t, void *key, int *pos);
-void tree_remove_at_pos (tree *t, int pos);
+void *tree_remove_at_pos (tree *t, int pos);
 void tree_foreach (tree *t, tree_traverse_func *func, void *data);
 int tree_insert (tree *t, void *key);
 void tree_append (tree* t, void *key);
diff --git a/src/common/url.c b/src/common/url.c
index 2f09ad3c..31a45d49 100644
--- a/src/common/url.c
+++ b/src/common/url.c
@@ -31,6 +31,7 @@
 #endif
 
 void *url_tree = NULL;
+GTree *url_btree = NULL;
 
 
 static int
@@ -46,6 +47,8 @@ url_clear (void)
 	tree_foreach (url_tree, (tree_traverse_func *)url_free, NULL);
 	tree_destroy (url_tree);
 	url_tree = NULL;
+	g_tree_destroy (url_btree);
+	url_btree = NULL;
 }
 
 static int
@@ -80,11 +83,7 @@ url_autosave (void)
 static int
 url_find (char *urltext)
 {
-	int pos;
-
-	if (tree_find (url_tree, urltext, (tree_cmp_func *)g_ascii_strcasecmp, NULL, &pos))
-		return 1;
-	return 0;
+	return (g_tree_lookup_extended (url_btree, urltext, NULL, NULL));
 }
 
 static void
@@ -110,15 +109,18 @@ url_add (char *urltext, int len)
 	if (data[len - 1] == ')')	/* chop trailing ) */
 		data[len - 1] = 0;
 
+	if (!url_tree)
+	{
+		url_tree = tree_new ((tree_cmp_func *)strcasecmp, NULL);
+		url_btree = g_tree_new ((GCompareFunc)strcasecmp);
+	}
+
 	if (url_find (data))
 	{
 		free (data);
 		return;
 	}
 
-	if (!url_tree)
-		url_tree = tree_new ((tree_cmp_func *)g_ascii_strcasecmp, NULL);
-
 	size = tree_size (url_tree);
 	/* 0 is unlimited */
 	if (prefs.url_grabber_limit > 0 && size >= prefs.url_grabber_limit)
@@ -127,10 +129,17 @@ url_add (char *urltext, int len)
 		   xchat is running */
 		size -= prefs.url_grabber_limit;
 		for(; size > 0; size--)
-			tree_remove_at_pos (url_tree, 0);
+		{
+			char *pos;
+
+			pos = tree_remove_at_pos (url_tree, 0);
+			g_tree_remove (url_btree, pos);
+			free (pos);
+		}
 	}
 
 	tree_append (url_tree, data);
+	g_tree_insert (url_btree, data, GINT_TO_POINTER (tree_size (url_tree) - 1));
 	fe_url_add (data);
 }