From 5a4af567ddcc5344bb4a01256003e601d06cc0f3 Mon Sep 17 00:00:00 2001 From: Matthew Jordan Date: Mon, 27 Oct 2014 02:27:03 +0000 Subject: [PATCH] res/res_phoneprov: Fix crash on shutdown caused by container cleanup In res_phoneprov, unloading the module first destroys the http_routes container, followed by the users. However, users may have a route in the http_routes container; the validity of this container is not checked in the users destructor. Hence, we hit an assert as the container has already been set to NULL. This patch does two things: (1) It adds a sanity check in the user destructor (because why not) (2) It switches the order of destruction, so that users are disposed of prior to the HTTP routes they may hold a reference to. Note that this crash was caught by the Test Suite (go go testing!) git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/12@426174 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- res/res_phoneprov.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/res/res_phoneprov.c b/res/res_phoneprov.c index 6cdefba97e..8562718825 100644 --- a/res/res_phoneprov.c +++ b/res/res_phoneprov.c @@ -758,7 +758,9 @@ static void user_destructor(void *obj) user->profile = unref_profile(user->profile); } - ao2_callback(http_routes, OBJ_UNLINK | OBJ_NODATA | OBJ_MULTIPLE, routes_delete_cb, (void *)user->macaddress); + if (http_routes) { + ao2_callback(http_routes, OBJ_UNLINK | OBJ_NODATA | OBJ_MULTIPLE, routes_delete_cb, (void *)user->macaddress); + } ast_string_field_free_memory(user); } @@ -1382,9 +1384,9 @@ static int unload_module(void) ao2_cleanup(profiles); profiles = NULL; delete_routes(); + delete_users(); ao2_cleanup(http_routes); http_routes = NULL; - delete_users(); ao2_cleanup(users); users = NULL; delete_providers(); -- 2.47.2