]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 372090 via svnmerge from
authorAutomerge script <automerge@asterisk.org>
Thu, 30 Aug 2012 21:24:42 +0000 (21:24 +0000)
committerAutomerge script <automerge@asterisk.org>
Thu, 30 Aug 2012 21:24:42 +0000 (21:24 +0000)
file:///srv/subversion/repos/asterisk/branches/10

................
  r372090 | mmichelson | 2012-08-30 15:53:09 -0500 (Thu, 30 Aug 2012) | 17 lines

  Prevent crash on shutdown due to refcount error on queues container.

  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
................

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

apps/app_queue.c

index 86681402901ddd541c81443cfee9f6330597127b..90f1a5e9ab340243f730e84be408e4f98db517cb 100644 (file)
@@ -8669,8 +8669,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;
 }