[asterisk-commits] phsultan: trunk r79666 - in /trunk: ./ res/res_jabber.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Thu Aug 16 04:45:22 CDT 2007


Author: phsultan
Date: Thu Aug 16 04:45:22 2007
New Revision: 79666

URL: http://svn.digium.com/view/asterisk?view=rev&rev=79666
Log:
Merged revisions 79665 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/branches/1.4

........
r79665 | phsultan | 2007-08-16 11:37:10 +0200 (Thu, 16 Aug 2007) | 21 lines

A fix for two critical problems detected while working with Daniel
McKeehan in issue #10184. 

Upon priority change, the resource list is not NULL terminated when
moving an item to the end of the list. This makes Asterisk endlessy
loop whenever it needs to read the list. Jids with different resource and
priority values, like in Gmail's and GoogleTalk's jabber clients put
that problem in evidence.

Upon reception of a 'from' attribute with an empty resource string,
Asterisk crashes when trying to access the found->cap pointer if the
resource list for the given buddy is not empty. This situation is
perfectly valid and must be handled. The Gizmoproject's jabber client
put that problem in evidence.

Also added a few comments in the code as well as a handle for the
capabilities from Gmail's jabber client, which are stored in a caps:c tag
rather than the usual c tag.

Closes issue #10184.

........

Modified:
    trunk/   (props changed)
    trunk/res/res_jabber.c

Propchange: trunk/
------------------------------------------------------------------------------
Binary property 'branch-1.4-merged' - no diff available.

Modified: trunk/res/res_jabber.c
URL: http://svn.digium.com/view/asterisk/trunk/res/res_jabber.c?view=diff&rev=79666&r1=79665&r2=79666
==============================================================================
--- trunk/res/res_jabber.c (original)
+++ trunk/res/res_jabber.c Thu Aug 16 04:45:22 2007
@@ -1286,29 +1286,42 @@
 				found = NULL;
 				break;
 			}
+			/* resource list is sorted by descending priority */
 			if (tmp->priority != priority) {
 				found->priority = priority;
 				if (!last && !found->next)
+					/* resource was found to be unique,
+					   leave loop */
 					break;
+				/* search for resource in our list
+				   and take it out for the moment */
 				if (last)
 					last->next = found->next;
 				else
 					buddy->resources = found->next;
+
 				last = NULL;
 				tmp = buddy->resources;
 				if (!buddy->resources)
 					buddy->resources = found;
+				/* priority processing */
 				while (tmp) {
+					/* insert resource back according to 
+					   its priority value */
 					if (found->priority > tmp->priority) {
 						if (last)
+							/* insert within list */
 							last->next = found;
 						found->next = tmp;
 						if (!last)
+							/* insert on top */
 							buddy->resources = found;
 						break;
 					}
 					if (!tmp->next) {
+						/* insert at the end of the list */
 						tmp->next = found;
+						found->next = NULL;
 						break;
 					}
 					last = tmp;
@@ -1321,6 +1334,7 @@
 		tmp = tmp->next;
 	}
 
+	/* resource not found in our list, create it */
 	if (!found && status != 6) {
 		found = ast_calloc(1, sizeof(*found));
 
@@ -1354,11 +1368,24 @@
 		if (!tmp)
 			buddy->resources = found;
 	}
+	
+	/* if 'from' attribute does not contain 'resource' string
+	   point to the top of our resource list */
+	if (!found && !pak->from->resource && buddy->resources) {
+		found = buddy->resources;
+	}
+
 	ASTOBJ_UNLOCK(buddy);
 	ASTOBJ_UNREF(buddy, aji_buddy_destroy);
 
 	node = iks_find_attrib(iks_find(pak->x, "c"), "node");
 	ver = iks_find_attrib(iks_find(pak->x, "c"), "ver");
+
+	/* handle gmail client's special caps:c tag */
+	if (!node && !ver) {
+		node = iks_find_attrib(iks_find(pak->x, "caps:c"), "node");
+		ver = iks_find_attrib(iks_find(pak->x, "caps:c"), "ver");
+	}
 
 	if(status !=6 && !found->cap) {
 		found->cap = aji_find_version(node, ver, pak);




More information about the asterisk-commits mailing list