Package: mcabber Version: 0.10.0-1 Severity: normal Tags: patch MCabber 0.10.0 crashes after "/status invisible". (Issue #56 in mcabber BTS) Upstream fix available at: <http://mcabber.com/hg/index.cgi/rev/3695266e16c7>
-- System Information: Debian Release: 6.0
# Author Mikael Berthe <[email protected]> # Date 1273746408 -7200 Fix error presence packet handling -- they should not be processed as normal messages. This fixes the segfault reported by pbd in issue #56. Index: mcabber-0.10.0/mcabber/utils.c =================================================================== --- mcabber-0.10.0.orig/mcabber/utils.c 2011-02-10 20:45:59.000000000 +0100 +++ mcabber-0.10.0/mcabber/utils.c 2011-02-10 20:46:10.000000000 +0100 @@ -64,6 +64,12 @@ char *ptr; char *alias; + if (!fjid) { + scr_LogPrint(LPRINT_LOGNORM, "** jidtodisp: NULL JID, " + "this is probably a bug, please report!"); + return NULL; + } + alias = g_strdup(fjid); if ((ptr = strchr(alias, JID_RESOURCE_SEPARATOR)) != NULL) { Index: mcabber-0.10.0/mcabber/xmpp.c =================================================================== --- mcabber-0.10.0.orig/mcabber/xmpp.c 2011-02-10 20:45:59.000000000 +0100 +++ mcabber-0.10.0/mcabber/xmpp.c 2011-02-10 20:46:10.000000000 +0100 @@ -1335,13 +1335,23 @@ char bpprio; time_t timestamp = 0L; LmMessageNode *muc_packet, *caps; - LmMessageSubType mstype; + LmMessageSubType mstype = lm_message_get_sub_type(m); // Check for MUC presence packet muc_packet = lm_message_node_find_xmlns (m->node, "http://jabber.org/protocol/muc#user"); from = lm_message_get_from(m); + if (!from) { + scr_LogPrint(LPRINT_LOGNORM, "Unexpected presence packet!"); + + if (mstype == LM_MESSAGE_SUB_TYPE_ERROR) { + display_server_error(lm_message_node_get_child(m->node, "error"), + lm_message_get_from(m)); + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + } rname = strchr(from, JID_RESOURCE_SEPARATOR); if (rname) rname++; @@ -1354,7 +1364,6 @@ } bjid = jidtodisp(from); - mstype = lm_message_get_sub_type(m); if (mstype == LM_MESSAGE_SUB_TYPE_ERROR) { LmMessageNode *x; @@ -1505,12 +1514,21 @@ char *buf; int newbuddy; const char *from = lm_message_get_from(m); - LmMessageSubType mstype; + LmMessageSubType mstype = lm_message_get_sub_type(m); + + if (mstype == LM_MESSAGE_SUB_TYPE_ERROR) { + display_server_error(lm_message_node_get_child(m->node, "error"), + lm_message_get_from(m)); + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } + if (!from) { + scr_LogPrint(LPRINT_DEBUG, "handle_s10n: Unexpected presence packet!"); + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + } r = jidtodisp(from); newbuddy = !roster_find(r, jidsearch, 0); - mstype = lm_message_get_sub_type(m); if (mstype == LM_MESSAGE_SUB_TYPE_SUBSCRIBE) { /* The sender wishes to subscribe to our presence */

