comparison mcabber/mcabber/xmpp.c @ 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
comparison
equal deleted inserted replaced
1909:9c14153e2580 1910:3695266e16c7
1339 const char *from, *rname, *p=NULL, *ustmsg=NULL; 1339 const char *from, *rname, *p=NULL, *ustmsg=NULL;
1340 enum imstatus ust; 1340 enum imstatus ust;
1341 char bpprio; 1341 char bpprio;
1342 time_t timestamp = 0L; 1342 time_t timestamp = 0L;
1343 LmMessageNode *muc_packet, *caps; 1343 LmMessageNode *muc_packet, *caps;
1344 LmMessageSubType mstype; 1344 LmMessageSubType mstype = lm_message_get_sub_type(m);
1345 1345
1346 // Check for MUC presence packet 1346 // Check for MUC presence packet
1347 muc_packet = lm_message_node_find_xmlns(m->node, NS_MUC_USER); 1347 muc_packet = lm_message_node_find_xmlns(m->node, NS_MUC_USER);
1348 1348
1349 from = lm_message_get_from(m); 1349 from = lm_message_get_from(m);
1350 if (!from) {
1351 scr_LogPrint(LPRINT_LOGNORM, "Unexpected presence packet!");
1352
1353 if (mstype == LM_MESSAGE_SUB_TYPE_ERROR) {
1354 display_server_error(lm_message_node_get_child(m->node, "error"),
1355 lm_message_get_from(m));
1356 return LM_HANDLER_RESULT_REMOVE_MESSAGE;
1357 }
1358 return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
1359 }
1350 1360
1351 rname = strchr(from, JID_RESOURCE_SEPARATOR); 1361 rname = strchr(from, JID_RESOURCE_SEPARATOR);
1352 if (rname) rname++; 1362 if (rname) rname++;
1353 1363
1354 if (settings_opt_get_int("ignore_self_presence")) { 1364 if (settings_opt_get_int("ignore_self_presence")) {
1357 return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; // Ignoring self presence 1367 return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; // Ignoring self presence
1358 } 1368 }
1359 } 1369 }
1360 1370
1361 bjid = jidtodisp(from); 1371 bjid = jidtodisp(from);
1362 mstype = lm_message_get_sub_type(m);
1363 1372
1364 if (mstype == LM_MESSAGE_SUB_TYPE_ERROR) { 1373 if (mstype == LM_MESSAGE_SUB_TYPE_ERROR) {
1365 LmMessageNode *x; 1374 LmMessageNode *x;
1366 scr_LogPrint(LPRINT_LOGNORM, "Error presence packet from <%s>", bjid); 1375 scr_LogPrint(LPRINT_LOGNORM, "Error presence packet from <%s>", bjid);
1367 x = lm_message_node_find_child(m->node, "error"); 1376 x = lm_message_node_find_child(m->node, "error");
1514 LmMessage *m, gpointer user_data) 1523 LmMessage *m, gpointer user_data)
1515 { 1524 {
1516 char *r; 1525 char *r;
1517 char *buf; 1526 char *buf;
1518 int newbuddy; 1527 int newbuddy;
1519 LmMessageSubType mstype;
1520 guint hook_result; 1528 guint hook_result;
1529 LmMessageSubType mstype = lm_message_get_sub_type(m);
1521 const char *from = lm_message_get_from(m); 1530 const char *from = lm_message_get_from(m);
1522 const char *msg = lm_message_node_get_child_value(m->node, "status"); 1531 const char *msg = lm_message_node_get_child_value(m->node, "status");
1523 1532
1533 if (mstype == LM_MESSAGE_SUB_TYPE_ERROR) {
1534 display_server_error(lm_message_node_get_child(m->node, "error"),
1535 lm_message_get_from(m));
1536 return LM_HANDLER_RESULT_REMOVE_MESSAGE;
1537 }
1538
1539 if (!from) {
1540 scr_LogPrint(LPRINT_DEBUG, "handle_s10n: Unexpected presence packet!");
1541 return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
1542 }
1524 r = jidtodisp(from); 1543 r = jidtodisp(from);
1525 1544
1526 newbuddy = !roster_find(r, jidsearch, 0); 1545 newbuddy = !roster_find(r, jidsearch, 0);
1527 mstype = lm_message_get_sub_type(m);
1528 1546
1529 hook_result = hk_subscription(mstype, r, msg); 1547 hook_result = hk_subscription(mstype, r, msg);
1530 1548
1531 if (mstype == LM_MESSAGE_SUB_TYPE_SUBSCRIBE) { 1549 if (mstype == LM_MESSAGE_SUB_TYPE_SUBSCRIBE) {
1532 /* The sender wishes to subscribe to our presence */ 1550 /* The sender wishes to subscribe to our presence */