Skip to content
Snippets Groups Projects
  • Walter Doekes's avatar
    dcb25bb0
    app_chanspy: Fix occasional deadlock with ChanSpy and Local channels. · dcb25bb0
    Walter Doekes authored
    Channel masquerading had a conflict with autochannel locking.
    
    When locking autochannel->channel, the channel is fetched from the
    autochannel and then locked. During the fetch, the autochannel -- which
    has no locks itself -- can be modified by someone who owns the channel
    lock. That means that the value of autochan->channel cannot be trusted
    until you hold the lock.
    
    In practice, this caused problems with Local channels getting
    masqueraded away while the ChanSpy attempted to get info from that
    channel. The old channel which was about to get removed got locked, but
    the new (replaced) channel got unlocked (no-op). Because the replaced
    channel was now locked (and would never get unlocked), it couldn't get
    removed from the channel list in a timely manner, and would now cause
    deadlocks when iterating over the channel list.
    
    This change checks the autochannel after locking the channel for changes
    to the autochannel. If the channel had been changed, the lock is
    reobtained on the new channel.
    
    In theory it seems possible that after this fix, the lock attempt on the
    old (wrong) channel can be on an already destroyed lock, maybe causing
    a crash. But that hasn't been observed in the wild and is harder induce
    than the current deadlock.
    
    Thanks go to Filip Frank for suggesting a fix similar to this and
    especially to IRC user hexanol for pointing out why this deadlock was
    possible and testing this fix. And to Richard for catching my rookie
    while loop mistake ;)
    
    ASTERISK-25321 #close
    
    Change-Id: I293ae0014e531cd0e675c3f02d1d118a98683def
    dcb25bb0
    History
    app_chanspy: Fix occasional deadlock with ChanSpy and Local channels.
    Walter Doekes authored
    Channel masquerading had a conflict with autochannel locking.
    
    When locking autochannel->channel, the channel is fetched from the
    autochannel and then locked. During the fetch, the autochannel -- which
    has no locks itself -- can be modified by someone who owns the channel
    lock. That means that the value of autochan->channel cannot be trusted
    until you hold the lock.
    
    In practice, this caused problems with Local channels getting
    masqueraded away while the ChanSpy attempted to get info from that
    channel. The old channel which was about to get removed got locked, but
    the new (replaced) channel got unlocked (no-op). Because the replaced
    channel was now locked (and would never get unlocked), it couldn't get
    removed from the channel list in a timely manner, and would now cause
    deadlocks when iterating over the channel list.
    
    This change checks the autochannel after locking the channel for changes
    to the autochannel. If the channel had been changed, the lock is
    reobtained on the new channel.
    
    In theory it seems possible that after this fix, the lock attempt on the
    old (wrong) channel can be on an already destroyed lock, maybe causing
    a crash. But that hasn't been observed in the wild and is harder induce
    than the current deadlock.
    
    Thanks go to Filip Frank for suggesting a fix similar to this and
    especially to IRC user hexanol for pointing out why this deadlock was
    possible and testing this fix. And to Richard for catching my rookie
    while loop mistake ;)
    
    ASTERISK-25321 #close
    
    Change-Id: I293ae0014e531cd0e675c3f02d1d118a98683def