changeset 1910:3695266e16c7

Fix error presence packet handling. This should also fix the segfault reported by pbd in issue #56.
author Mikael Berthe <mikael@lilotux.net>
date Thu, 13 May 2010 12:26:48 +0200
parents 9c14153e2580
children baa52ea32b47
files mcabber/mcabber/utils.c mcabber/mcabber/xmpp.c
diffstat 2 files changed, 28 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- 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) {
--- 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);