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 }