after call of g_slist_remove() the `pos` points to released area, so dereferencing pos->data isn't acceptable. --- irssi-0.8.10/src/irc/dcc/dcc.c.orig 2005-10-19 04:13:31.000000000 +0200 +++ irssi-0.8.10/src/irc/dcc/dcc.c 2006-05-02 22:33:11.000000000 +0200 @@ -55,11 +55,13 @@ void dcc_unregister_type(const char *type) { GSList *pos; + gpointer data; pos = gslist_find_string(dcc_types, type); if (pos != NULL) { - dcc_types = g_slist_remove(dcc_types, pos->data); - g_free(pos->data); + data = pos->data; + dcc_types = g_slist_remove(dcc_types, data); + g_free(data); } }