From: Alec L Davis Date: Tue, 11 Jun 2013 08:03:38 +0000 (+0000) Subject: IAX2: Transfer Reject: Lock bridgecallno before touching it, refactor X-Git-Tag: 1.8.23.0-rc2~1^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=fe05e0d821d5722f495b76607646ab7680a3c731;p=thirdparty%2Fasterisk.git 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/ git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.8@391333 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index 154b2a6086..f985a4b005 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -11369,15 +11369,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 ? iaxs[fr->callno]->owner->name : ""); - 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 ? iaxs[fr->callno]->owner->name : ""); + 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) {