]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Prevent crash on shutdown due to refcount error on queues container.
authorMark Michelson <mmichelson@digium.com>
Thu, 30 Aug 2012 20:54:51 +0000 (20:54 +0000)
committerMark Michelson <mmichelson@digium.com>
Thu, 30 Aug 2012 20:54:51 +0000 (20:54 +0000)
When app_queue is unloaded, the queues container has its refcount
decremented, potentially to 0. Then the taskprocessor responsible
for handling device state changes is unreferenced. If the
taskprocessor happens to be just about to run its task, then it
will create and destroy an iterator on the queues container.
This can cause the refcount on the queues container to increase to
1 and then back to 0. Going back to 0 a second time results in
double frees.

This failure was seen periodically in the testsuite when Asterisk
would shut down.
........

Merged revisions 372089 from http://svn.asterisk.org/svn/asterisk/branches/1.8
........

Merged revisions 372090 from http://svn.asterisk.org/svn/asterisk/branches/10
........

Merged revisions 372091 from http://svn.asterisk.org/svn/asterisk/branches/11

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

apps/app_queue.c

index 1ca8dc5bdb9cc263b5751a6e4a3f24c6e4430a3a..8cc6cc1a5cf0f41d804b8b56da0d5a951c2b255f 100644 (file)
@@ -9484,8 +9484,8 @@ static int unload_module(void)
                queue_t_unref(q, "Done with iterator");
        }
        ao2_iterator_destroy(&q_iter);
-       ao2_ref(queues, -1);
        devicestate_tps = ast_taskprocessor_unreference(devicestate_tps);
+       ao2_ref(queues, -1);
        ast_unload_realtime("queue_members");
        return res;
 }