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/branches/1.4@84890 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.4
Philippe Sultan 18 years ago
parent 9ae23cba31
commit c7e7a27bac

@ -1185,7 +1185,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) free(tmp->description);
@ -1258,7 +1258,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 = (struct aji_resource *) malloc(sizeof(struct aji_resource));
memset(found, 0, sizeof(struct aji_resource));
@ -1293,12 +1293,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);
@ -1311,7 +1305,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;

Loading…
Cancel
Save