From c231c85ea4a0a3828097e92661f1691cc5c83014 Mon Sep 17 00:00:00 2001
From: Corey Farrell <git@cfware.com>
Date: Wed, 22 Apr 2015 16:17:53 -0400
Subject: [PATCH] Astobj2: Ensure all calls to __adjust_lock pass a valid
 object.

__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 | 6 ++++++
 main/astobj2_hash.c      | 2 ++
 main/astobj2_rbtree.c    | 2 ++
 3 files changed, 10 insertions(+)

diff --git a/main/astobj2_container.c b/main/astobj2_container.c
index d0abc7985f..07d10b9f93 100644
--- a/main/astobj2_container.c
+++ b/main/astobj2_container.c
@@ -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;
diff --git a/main/astobj2_hash.c b/main/astobj2_hash.c
index 76259dc7ff..110dd1602c 100644
--- a/main/astobj2_hash.c
+++ b/main/astobj2_hash.c
@@ -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)
diff --git a/main/astobj2_rbtree.c b/main/astobj2_rbtree.c
index a069c408e1..d3a9025720 100644
--- a/main/astobj2_rbtree.c
+++ b/main/astobj2_rbtree.c
@@ -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)
-- 
GitLab