Deadlock in channel masquerade handling
authorDavid Vossel <dvossel@digium.com>
Wed, 7 Oct 2009 22:58:38 +0000 (22:58 +0000)
committerDavid Vossel <dvossel@digium.com>
Wed, 7 Oct 2009 22:58:38 +0000 (22:58 +0000)
commit9456ab2724901b565c7cdb19973e5785647a27ba
tree31296f94172a5a376dfc1c3c764a970f0b723425
parent49b90d5e61dd158e963cd5d623cbca50e8b4f1c8
Deadlock in channel masquerade handling

Channels are stored in an ao2_container.  When accessing an item within
an ao2_container the proper locking order is to first lock the container,
and then the items within it.

In ast_do_masquerade both the clone and original channel must be locked
for the entire duration of the function.  The problem with this is that
it attemptes to unlink and link these channels back into the ao2_container
when one of the channel's name changes.  This is invalid locking order as
the process of unlinking and linking will lock the ao2_container while
the channels are locked!!! Now, both the channels in do_masquerade are
unlinked from the ao2_container and then locked for the entire function.
At the end of the function both channels are unlocked and linked back
into the container with their new names as hash values.

This new method of requiring all channels and tech pvts to be unlocked
before ast_do_masquerade() or ast_change_name() required several
changes throughout the code base.

(closes issue #15911)
Reported by: russell
Patches:
      masq_deadlock_trunk.diff uploaded by dvossel (license 671)
Tested by: dvossel, atis

(closes issue #15618)
Reported by: lmsteffan
Patches:
      deadlock_local_attended_transfers_trunk.diff uploaded by dvossel (license 671)
Tested by: lmsteffan, dvossel

Review: https://reviewboard.asterisk.org/r/387/

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@222761 65c4cc65-6c06-0410-ace0-fbb531ad65f3
channels/chan_misdn.c
channels/chan_sip.c
include/asterisk/channel.h
main/channel.c
main/features.c
main/pbx.c