# HG changeset patch # User Mikael Berthe # Date 1273746408 -7200 # Node ID 3695266e16c722cd4c0edbea2a981a33279cc704 # Parent 9c14153e258088bbce24572746e354aa180f8fc1 Fix error presence packet handling. This should also fix the segfault reported by pbd in issue #56. diff -r 9c14153e2580 -r 3695266e16c7 mcabber/mcabber/utils.c --- a/mcabber/mcabber/utils.c Sun Apr 18 14:14:05 2010 +0200 +++ b/mcabber/mcabber/utils.c Thu May 13 12:26:48 2010 +0200 @@ -65,6 +65,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) { diff -r 9c14153e2580 -r 3695266e16c7 mcabber/mcabber/xmpp.c --- a/mcabber/mcabber/xmpp.c Sun Apr 18 14:14:05 2010 +0200 +++ b/mcabber/mcabber/xmpp.c Thu May 13 12:26:48 2010 +0200 @@ -1341,12 +1341,22 @@ 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, NS_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++; @@ -1359,7 +1369,6 @@ } bjid = jidtodisp(from); - mstype = lm_message_get_sub_type(m); if (mstype == LM_MESSAGE_SUB_TYPE_ERROR) { LmMessageNode *x; @@ -1516,15 +1525,24 @@ char *r; char *buf; int newbuddy; - LmMessageSubType mstype; guint hook_result; + LmMessageSubType mstype = lm_message_get_sub_type(m); const char *from = lm_message_get_from(m); const char *msg = lm_message_node_get_child_value(m->node, "status"); + 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); hook_result = hk_subscription(mstype, r, msg);