Mercurial > pidgin
comparison libpurple/protocols/jabber/presence.c @ 22781:2404b13940e9
Fix a crash in Jabber that I think happens someone someone signs off
immediately after your client requests capability info about them.
The callback is called and passed a reference to the old jbr, but the
jbr no longer exists.
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Tue, 29 Apr 2008 02:06:03 +0000 |
parents | 3225c99785b8 |
children | a95fcf01f72c |
comparison
equal
deleted
inserted
replaced
22780:46ab2e2171b8 | 22781:2404b13940e9 |
---|---|
367 } | 367 } |
368 } | 368 } |
369 | 369 |
370 typedef struct _JabberPresenceCapabilities { | 370 typedef struct _JabberPresenceCapabilities { |
371 JabberStream *js; | 371 JabberStream *js; |
372 JabberBuddyResource *jbr; | 372 JabberBuddy *jb; |
373 char *from; | 373 char *from; |
374 } JabberPresenceCapabilities; | 374 } JabberPresenceCapabilities; |
375 | 375 |
376 static void jabber_presence_set_capabilities(JabberCapsClientInfo *info, gpointer user_data) { | 376 static void jabber_presence_set_capabilities(JabberCapsClientInfo *info, gpointer user_data) { |
377 JabberPresenceCapabilities *userdata = user_data; | 377 JabberPresenceCapabilities *userdata = user_data; |
378 JabberID *jid; | |
379 JabberBuddyResource *jbr; | |
378 GList *iter; | 380 GList *iter; |
379 | 381 |
380 if(userdata->jbr->caps) | 382 jid = jabber_id_new(userdata->from); |
381 jabber_caps_free_clientinfo(userdata->jbr->caps); | 383 jbr = jabber_buddy_find_resource(userdata->jb, jid->resource); |
382 userdata->jbr->caps = info; | 384 jabber_id_free(jid); |
385 | |
386 if(!jbr) { | |
387 g_free(userdata->from); | |
388 g_free(userdata); | |
389 return; | |
390 } | |
391 | |
392 if(jbr->caps) | |
393 jabber_caps_free_clientinfo(jbr->caps); | |
394 jbr->caps = info; | |
383 | 395 |
384 if (info) { | 396 if (info) { |
385 for(iter = info->features; iter; iter = g_list_next(iter)) { | 397 for(iter = info->features; iter; iter = g_list_next(iter)) { |
386 if(!strcmp((const char*)iter->data, "http://jabber.org/protocol/commands")) { | 398 if(!strcmp((const char*)iter->data, "http://jabber.org/protocol/commands")) { |
387 JabberIq *iq = jabber_iq_new_query(userdata->js, JABBER_IQ_GET, "http://jabber.org/protocol/disco#items"); | 399 JabberIq *iq = jabber_iq_new_query(userdata->js, JABBER_IQ_GET, "http://jabber.org/protocol/disco#items"); |
739 const char *ext = xmlnode_get_attrib(caps,"ext"); | 751 const char *ext = xmlnode_get_attrib(caps,"ext"); |
740 | 752 |
741 if(node && ver) { | 753 if(node && ver) { |
742 JabberPresenceCapabilities *userdata = g_new0(JabberPresenceCapabilities, 1); | 754 JabberPresenceCapabilities *userdata = g_new0(JabberPresenceCapabilities, 1); |
743 userdata->js = js; | 755 userdata->js = js; |
744 userdata->jbr = jbr; | 756 userdata->jb = jb; |
745 userdata->from = g_strdup(from); | 757 userdata->from = g_strdup(from); |
746 jabber_caps_get_info(js, from, node, ver, ext, jabber_presence_set_capabilities, userdata); | 758 jabber_caps_get_info(js, from, node, ver, ext, jabber_presence_set_capabilities, userdata); |
747 } | 759 } |
748 } | 760 } |
749 } | 761 } |