summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlec L Davis <sivad.a@paradise.net.nz>2013-06-11 08:13:39 +0000
committerAlec L Davis <sivad.a@paradise.net.nz>2013-06-11 08:13:39 +0000
commitb0143074fa690b09bd8cad7f59dc870ecc57eb86 (patch)
tree1245252b889204083534c8a373602f025c901a1e
parented85661f43ae5ea5cbca3055f64964964e79e845 (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.c25
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) {