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 */

Reply via email to