Mercurial > pidgin
changeset 27840:0c90b164a735
jabber: Fix a crash due to a contact having a resource with jbr->name == NULL
This happens with legacy transports, when the transport sends presence
from the bare JID. This then crashes in g_str_hash when trying to look up
the jbr from the resource name. Fixes #9827.
author | Paul Aurich <paul@darkrain42.org> |
---|---|
date | Thu, 06 Aug 2009 03:21:59 +0000 |
parents | 1cf504b5e62a |
children | 0e516784bbae |
files | libpurple/protocols/jabber/buddy.c |
diffstat | 1 files changed, 18 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/libpurple/protocols/jabber/buddy.c Wed Aug 05 16:11:20 2009 +0000 +++ b/libpurple/protocols/jabber/buddy.c Thu Aug 06 03:21:59 2009 +0000 @@ -1193,6 +1193,22 @@ g_free(jbri); } +static guint jbir_hash(gconstpointer v) +{ + if (v) + return g_str_hash(v); + else + return 0; +} + +static gboolean jbir_equal(gconstpointer v1, gconstpointer v2) +{ + const gchar *resource_1 = v1; + const gchar *resource_2 = v2; + + return purple_strequal(resource_1, resource_2); +} + static void jabber_version_parse(JabberStream *js, const char *from, JabberIqType type, const char *id, xmlnode *packet, gpointer data) @@ -1464,9 +1480,7 @@ char *full_jid = NULL; const char *to; - g_return_if_fail(jbr->name != NULL); - - if (is_bare_jid) { + if (is_bare_jid && jbr->name) { full_jid = g_strdup_printf("%s/%s", jid, jbr->name); to = full_jid; } else @@ -1535,7 +1549,7 @@ jbi->jid = g_strdup(jid); jbi->js = js; jbi->jb = jb; - jbi->resources = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, jabber_buddy_info_resource_free); + jbi->resources = g_hash_table_new_full(jbir_hash, jbir_equal, g_free, jabber_buddy_info_resource_free); jbi->user_info = purple_notify_user_info_new(); iq = jabber_iq_new(js, JABBER_IQ_GET);