]> git.ipfire.org Git - thirdparty/asterisk.git/commit
chan_sip.c: Fix packet retransid deadlock potential. 97/2397/3
authorRichard Mudgett <rmudgett@digium.com>
Wed, 9 Mar 2016 22:32:28 +0000 (16:32 -0600)
committerRichard Mudgett <rmudgett@digium.com>
Wed, 16 Mar 2016 19:53:00 +0000 (14:53 -0500)
commit38c1cdab2ce3f5f00cd5a6a0f561910d9265bea7
treeae69c3b07bbb7255e892bd183b3196efabd28f62
parente4ad55c888bc6c7e0d382e716d1d8ed4219d6cb2
chan_sip.c: Fix packet retransid deadlock potential.

This patch is part of a series to resolve deadlocks in chan_sip.c.

Stopping a scheduled event can result in a deadlock if the scheduled event
is running when you try to stop the event.  If you hold a lock needed by
the scheduled event while trying to stop the scheduled event then a
deadlock can happen.  The general strategy for resolving the deadlock
potential is to push the actual starting and stopping of the scheduled
events off onto the scheduler/do_monitor() thread by scheduling an
immediate one shot scheduled event.  Some restructuring may be needed
because the code may assume that the start/stop of the scheduled events is
immediate.

* Fix retrans_pkt() to call check_pendings() with both the owner channel
and the private objects locked as required.

* Refactor dialog retransmission packet list to safely remove packet
nodes.  The list nodes are now ao2 objects.  The list has a ref and the
scheduled entry has a ref.

ASTERISK-25023

Change-Id: I50926d81be53f4cd3d572a3292cd25f563f59641
channels/chan_sip.c