From 62903cd171acb49ed66056c32edbcc0fd56b07c5 Mon Sep 17 00:00:00 2001 From: RichardHitt Date: Mon, 1 Oct 2012 12:53:25 -0700 Subject: Fix memory leak related to url grabbing --- src/common/url.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) (limited to 'src/common/url.c') 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); } -- cgit 1.4.1