mirror of
https://github.com/hexchat/hexchat.git
synced 2024-11-10 05:02:50 +01:00
Fix memory leak related to url grabbing
This commit is contained in:
parent
9c3ea36483
commit
62903cd171
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user