summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Jordan <mjordan@digium.com>2014-10-27 02:27:56 +0000
committerMatthew Jordan <mjordan@digium.com>2014-10-27 02:27:56 +0000
commit62bee9b327d048852ad33bce47baeeab7bb3878e (patch)
treee4b35cdda93ea8b8ba0937db46bfe238a3f7f75a
parent130a3fcd7ff7d4f253d4f2509fca9b6c752377b0 (diff)
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!) ........ Merged revisions 426174 from http://svn.asterisk.org/svn/asterisk/branches/12 ........ Merged revisions 426176 from http://svn.asterisk.org/svn/asterisk/branches/13 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@426179 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r--res/res_phoneprov.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/res/res_phoneprov.c b/res/res_phoneprov.c
index 78511cccf..ccaa6d246 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();