summaryrefslogtreecommitdiff
path: root/main/astobj2.c
diff options
context:
space:
mode:
authorKevin P. Fleming <kpfleming@digium.com>2009-10-22 18:41:47 +0000
committerKevin P. Fleming <kpfleming@digium.com>2009-10-22 18:41:47 +0000
commitbe796e703ae8a05dde29c26f92f545b5ec0c40bc (patch)
tree16bf92d241aef3686453a42b65b225714f5b8199 /main/astobj2.c
parent496282194caafbfe404ebe83f5cc9c4c617df3f2 (diff)
Fix a refcount error introduced by yesterday's OBJ_MULTIPLE commit.
When an object is being unlinked from its container *and* being returned to the caller, we do not want to decrement the reference count after unlinking it from the container, as the reference that the container held is what we are returning to the caller... and if it was the only remaining reference to the object, that could result in the object being destroyed. git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@225405 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main/astobj2.c')
-rw-r--r--main/astobj2.c8
1 files changed, 1 insertions, 7 deletions
diff --git a/main/astobj2.c b/main/astobj2.c
index cecef7c66..da52ab1f0 100644
--- a/main/astobj2.c
+++ b/main/astobj2.c
@@ -685,7 +685,6 @@ static void *internal_ao2_callback(struct ao2_container *c,
match &= cb_default(EXTERNAL_OBJ(cur->astobj), arg, flags);
}
- /* we found the object, performing operations according flags */
if (match == 0) { /* no match, no stop, continue */
continue;
} else if (match == CMP_STOP) { /* no match but stop, we are done */
@@ -693,6 +692,7 @@ static void *internal_ao2_callback(struct ao2_container *c,
break;
}
+ /* we found the object, performing operations according flags */
/* we have a match (CMP_MATCH) here */
if (!(flags & OBJ_NODATA)) { /* if must return the object, record the value */
/* it is important to handle this case before the unlink */
@@ -719,12 +719,6 @@ static void *internal_ao2_callback(struct ao2_container *c,
AST_LIST_REMOVE_CURRENT(entry);
/* update number of elements */
ast_atomic_fetchadd_int(&c->elements, -1);
- if (!(flags & OBJ_NODATA)) {
- if (tag)
- __ao2_ref_debug(EXTERNAL_OBJ(cur->astobj), -1, tag, file, line, funcname);
- else
- __ao2_ref(EXTERNAL_OBJ(cur->astobj), -1);
- }
ast_free(cur); /* free the link record */
}