]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Don't crash or deadlock on module unload
authorTerry Wilson <twilson@digium.com>
Fri, 15 Oct 2010 16:16:57 +0000 (16:16 +0000)
committerTerry Wilson <twilson@digium.com>
Fri, 15 Oct 2010 16:16:57 +0000 (16:16 +0000)
We can't hold the lock while pthread_join is called since aji_log_hook will
attempt to lock from the other therad. We reorder the pthread_join and
ast_aji_disconnect so that we don't do an SSL_read() while SSL_shutdown is
running, causing a crash.

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

res/res_jabber.c

index dbbeab95c57e516111b72d3bfd8141dbc169cb39..e4bdacc7859ca5d62abe4f68b38880b205e9ca4a 100644 (file)
@@ -3061,12 +3061,12 @@ static int unload_module(void)
        ast_custom_function_unregister(&jabberstatus_function);
        
        ASTOBJ_CONTAINER_TRAVERSE(&clients, 1, {
-               ASTOBJ_RDLOCK(iterator);
+               ASTOBJ_WRLOCK(iterator);
                ast_debug(3, "JABBER: Releasing and disconnecting client: %s\n", iterator->name);
                iterator->state = AJI_DISCONNECTING;
-               ast_aji_disconnect(iterator);
-               pthread_join(iterator->thread, NULL);
                ASTOBJ_UNLOCK(iterator);
+               pthread_join(iterator->thread, NULL);
+               ast_aji_disconnect(iterator);
        });
 
        ASTOBJ_CONTAINER_DESTROYALL(&clients, aji_client_destroy);