]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res/res_phoneprov: Fix crash on shutdown caused by container cleanup
authorMatthew Jordan <mjordan@digium.com>
Mon, 27 Oct 2014 02:27:23 +0000 (02:27 +0000)
committerMatthew Jordan <mjordan@digium.com>
Mon, 27 Oct 2014 02:27:23 +0000 (02:27 +0000)
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

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/13@426176 65c4cc65-6c06-0410-ace0-fbb531ad65f3

res/res_phoneprov.c

index 7aa157d013d8cef9b4fb4387c404d96f662c04c5..ce008d20febaff9174c047233cf3fd86d94ad61f 100644 (file)
@@ -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();