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/cfgfiles.c | 2 +- src/common/tree.c | 4 +++- src/common/tree.h | 2 +- src/common/url.c | 27 ++++++++++++++++++--------- 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); } -- cgit 1.4.1