From c61547fee6fdc1e132d359311da48e87d98d25b1 Mon Sep 17 00:00:00 2001 From: Richard Mudgett Date: Tue, 18 Aug 2015 14:46:46 -0500 Subject: res_ari.c: Add missing off nominal unlock and remove a RAII_VAR(). Change-Id: I0c5e7b34057f26dadb39489c4dac3015c52f5dbf --- res/res_ari.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) (limited to 'res/res_ari.c') diff --git a/res/res_ari.c b/res/res_ari.c index 761c2dd39..f39db16cd 100644 --- a/res/res_ari.c +++ b/res/res_ari.c @@ -180,8 +180,7 @@ int ast_ari_add_handler(struct stasis_rest_handlers *handler) SCOPED_MUTEX(lock, &root_handler_lock); - old_size = sizeof(*new_handler) + - root_handler->num_children * sizeof(handler); + old_size = sizeof(*new_handler) + root_handler->num_children * sizeof(handler); new_size = old_size + sizeof(handler); new_handler = ao2_alloc(new_size, NULL); @@ -200,21 +199,24 @@ int ast_ari_add_handler(struct stasis_rest_handlers *handler) int ast_ari_remove_handler(struct stasis_rest_handlers *handler) { - RAII_VAR(struct stasis_rest_handlers *, new_handler, NULL, ao2_cleanup); - size_t size, i, j; + struct stasis_rest_handlers *new_handler; + size_t size; + size_t i; + size_t j; ast_assert(root_handler != NULL); ast_mutex_lock(&root_handler_lock); - size = sizeof(*new_handler) + - root_handler->num_children * sizeof(handler); + size = sizeof(*new_handler) + root_handler->num_children * sizeof(handler); new_handler = ao2_alloc(size, NULL); if (!new_handler) { + ast_mutex_unlock(&root_handler_lock); return -1; } - memcpy(new_handler, root_handler, sizeof(*new_handler)); + /* Create replacement root_handler less the handler to remove. */ + memcpy(new_handler, root_handler, sizeof(*new_handler)); for (i = 0, j = 0; i < root_handler->num_children; ++i) { if (root_handler->children[i] == handler) { ast_module_unref(ast_module_info->self); @@ -224,9 +226,10 @@ int ast_ari_remove_handler(struct stasis_rest_handlers *handler) } new_handler->num_children = j; + /* Replace the old root_handler with the new. */ ao2_cleanup(root_handler); - ao2_ref(new_handler, +1); root_handler = new_handler; + ast_mutex_unlock(&root_handler_lock); return 0; } -- cgit v1.2.3