Astobj2: Ensure all calls to __adjust_lock pass a valid object.
authorCorey Farrell <git@cfware.com>
Wed, 22 Apr 2015 20:17:53 +0000 (16:17 -0400)
committerCorey Farrell <git@cfware.com>
Thu, 23 Apr 2015 00:47:47 +0000 (19:47 -0500)
__adjust_lock doesn't check for invalid objects, and doesn't have an
appropriate return value for invalid objects.  Most callers of
__adjust_lock pass objects that have already been confirmed valid,
this change adds checks before the remaining calls.

ASTERISK-24997 #close
Reported by: Corey Farrell

Change-Id: I669100f87937cc3f867cec56a27ae9c01292908f

main/astobj2_container.c
main/astobj2_hash.c
main/astobj2_rbtree.c

index d0abc79..07d10b9 100644 (file)
@@ -510,6 +510,12 @@ struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags)
 
 void ao2_iterator_restart(struct ao2_iterator *iter)
 {
+       if (!is_ao2_object(iter->c)) {
+               ast_log(LOG_ERROR, "Iterator container is not valid.\n");
+               ast_assert(0);
+               return;
+       }
+
        /* Release the last container node reference if we have one. */
        if (iter->last_node) {
                enum ao2_lock_req orig_lock;
index 76259dc..110dd16 100644 (file)
@@ -186,6 +186,8 @@ static void hash_ao2_node_destructor(void *v_doomed)
                 * same node.
                 */
                my_container = (struct ao2_container_hash *) doomed->common.my_container;
+               ast_assert(is_ao2_object(my_container));
+
                __adjust_lock(my_container, AO2_LOCK_REQ_WRLOCK, 1);
 
 #if defined(AO2_DEBUG)
index a069c40..d3a9025 100644 (file)
@@ -878,6 +878,8 @@ static void rb_ao2_node_destructor(void *v_doomed)
                 * same node.
                 */
                my_container = (struct ao2_container_rbtree *) doomed->common.my_container;
+               ast_assert(is_ao2_object(my_container));
+
                __adjust_lock(my_container, AO2_LOCK_REQ_WRLOCK, 1);
 
 #if defined(AO2_DEBUG)