Merged revisions 84890 via svnmerge from
authorPhilippe Sultan <philippe.sultan@gmail.com>
Sun, 7 Oct 2007 15:54:48 +0000 (15:54 +0000)
committerPhilippe Sultan <philippe.sultan@gmail.com>
Sun, 7 Oct 2007 15:54:48 +0000 (15:54 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.4

........
r84890 | phsultan | 2007-10-07 17:52:44 +0200 (Sun, 07 Oct 2007) | 5 lines

Prevent Asterisk from crashing when receiving a presence packet
without resource from a buddy that is known to have a resource list.

Revert a change I previously made, where Asterisk could point to a
freed memory location.
........

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@84891 65c4cc65-6c06-0410-ace0-fbb531ad65f3

res/res_jabber.c

index 5743898..83114a5 100644 (file)
@@ -1284,7 +1284,7 @@ static void aji_handle_presence(struct aji_client *client, ikspak *pak)
        tmp = buddy->resources;
        descrip = ast_strdup(iks_find_cdata(pak->x,"status"));
 
-       while (tmp) {
+       while (tmp && pak->from->resource) {
                if (!strcasecmp(tmp->resource, pak->from->resource)) {
                        tmp->status = status;
                        if (tmp->description) ast_free(tmp->description);
@@ -1357,7 +1357,7 @@ static void aji_handle_presence(struct aji_client *client, ikspak *pak)
        }
 
        /* resource not found in our list, create it */
-       if (!found && status != 6) {
+       if (!found && status != 6 && pak->from->resource) {
                found = ast_calloc(1, sizeof(*found));
 
                if (!found) {
@@ -1391,12 +1391,6 @@ static void aji_handle_presence(struct aji_client *client, ikspak *pak)
                        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);
 
@@ -1409,7 +1403,8 @@ static void aji_handle_presence(struct aji_client *client, ikspak *pak)
                ver = iks_find_attrib(iks_find(pak->x, "caps:c"), "ver");
        }
 
-       if(status !=6 && !found->cap) {
+       /* retrieve capabilites of the new resource */
+       if(status !=6 && found && !found->cap) {
                found->cap = aji_find_version(node, ver, pak);
                if(gtalk_yuck(pak->x)) /* gtalk should do discover */
                        found->cap->jingle = 1;