stasis: Fix leaks
authorCorey Farrell <git@cfware.com>
Thu, 19 Sep 2019 22:32:56 +0000 (18:32 -0400)
committerCorey Farrell <git@cfware.com>
Thu, 19 Sep 2019 22:36:40 +0000 (17:36 -0500)
* Release reference returned by cache_remove
* state_alloc unconditionally bumped state_topic even when it was
  locally allocated.

Change-Id: I51101bf7d07b8dc8ce8fc46b6cb31fbbd213fbc7

main/stasis_cache.c
main/stasis_state.c

index 6be4bf1..bcd7e7d 100644 (file)
@@ -868,7 +868,7 @@ static void caching_topic_exec(void *data, struct stasis_subscription *sub,
                        ao2_wrlock(caching_topic->cache->entries);
                        sub = cache_find(caching_topic->cache->entries, stasis_subscription_change_type(), change->uniqueid);
                        if (sub) {
-                               cache_remove(caching_topic->cache->entries, sub, stasis_message_eid(message));
+                               ao2_cleanup(cache_remove(caching_topic->cache->entries, sub, stasis_message_eid(message)));
                                ao2_cleanup(sub);
                        }
                        ao2_unlock(caching_topic->cache->entries);
index a915972..aa00f9a 100644 (file)
@@ -165,6 +165,13 @@ static struct stasis_state *state_alloc(struct stasis_state_manager *manager,
                        return NULL;
                }
                ast_free(name);
+       } else {
+               /*
+                * Since the state topic was passed in, go ahead and bump its reference.
+                * By doing this here first, it allows us to consistently decrease the reference on
+                * state allocation error.
+                */
+               ao2_ref(state_topic, +1);
        }
 
        if (!id) {
@@ -175,13 +182,6 @@ static struct stasis_state *state_alloc(struct stasis_state_manager *manager,
                id = state_id_by_topic(manager->all_topic, state_topic);
        }
 
-       /*
-        * Since the state topic could have been passed in, go ahead and bump its reference.
-        * By doing this here first, it allows us to consistently decrease the reference on
-        * state allocation error.
-        */
-       ao2_ref(state_topic, +1);
-
        state = ao2_alloc(sizeof(*state) + strlen(id) + 1, state_dtor);
        if (!state) {
                ast_log(LOG_ERROR, "Unable to allocate state '%s' in manager '%s'\n",