diff options
author | Alec L Davis <sivad.a@paradise.net.nz> | 2013-06-11 08:13:39 +0000 |
---|---|---|
committer | Alec L Davis <sivad.a@paradise.net.nz> | 2013-06-11 08:13:39 +0000 |
commit | b0143074fa690b09bd8cad7f59dc870ecc57eb86 (patch) | |
tree | 1245252b889204083534c8a373602f025c901a1e | |
parent | ed85661f43ae5ea5cbca3055f64964964e79e845 (diff) |
IAX2: Transfer Reject: Lock bridgecallno before touching it, refactor
1). When touching the bridgecallno, we need to lock it.
2). Remove magic number '0' and replace with TRANSFER_NONE.
3). Exit early if no bridgecallno.
4). Reduce indentation.
Reported by: alecdavis
Tested by: alecdavis
alecdavis (license 585)
Review https://reviewboard.asterisk.org/r/2613/
........
Merged revisions 391333 from http://svn.asterisk.org/svn/asterisk/branches/1.8
........
Merged revisions 391334 from http://svn.asterisk.org/svn/asterisk/branches/11
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@391335 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r-- | channels/chan_iax2.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index a42801194..7c0de9936 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -11204,15 +11204,28 @@ immediatedial: } break; case IAX_COMMAND_TXREJ: - iaxs[fr->callno]->transferring = 0; - ast_verb(3, "Channel '%s' unable to transfer\n", iaxs[fr->callno]->owner ? ast_channel_name(iaxs[fr->callno]->owner) : "<Unknown>"); - memset(&iaxs[fr->callno]->transfer, 0, sizeof(iaxs[fr->callno]->transfer)); if (iaxs[fr->callno]->bridgecallno) { - if (iaxs[iaxs[fr->callno]->bridgecallno]->transferring) { - iaxs[iaxs[fr->callno]->bridgecallno]->transferring = 0; - send_command(iaxs[iaxs[fr->callno]->bridgecallno], AST_FRAME_IAX, IAX_COMMAND_TXREJ, 0, NULL, 0, -1); + while (ast_mutex_trylock(&iaxsl[iaxs[fr->callno]->bridgecallno])) { + DEADLOCK_AVOIDANCE(&iaxsl[fr->callno]); + } + if (!iaxs[fr->callno]) { + break; } } + + iaxs[fr->callno]->transferring = TRANSFER_NONE; + ast_verb(3, "Channel '%s' unable to transfer\n", iaxs[fr->callno]->owner ? ast_channel_name(iaxs[fr->callno]->owner) : "<Unknown>"); + memset(&iaxs[fr->callno]->transfer, 0, sizeof(iaxs[fr->callno]->transfer)); + + if (!iaxs[fr->callno]->bridgecallno) { + break; + } + + if (iaxs[iaxs[fr->callno]->bridgecallno]->transferring) { + iaxs[iaxs[fr->callno]->bridgecallno]->transferring = TRANSFER_NONE; + send_command(iaxs[iaxs[fr->callno]->bridgecallno], AST_FRAME_IAX, IAX_COMMAND_TXREJ, 0, NULL, 0, -1); + } + ast_mutex_unlock(&iaxsl[iaxs[fr->callno]->bridgecallno]); break; case IAX_COMMAND_TXREADY: if (iaxs[fr->callno]->bridgecallno) { |