From: Joshua Colp Date: Thu, 4 Oct 2012 17:44:38 +0000 (+0000) Subject: Fix a regression from direct media ACLs where the directrtpsetup option no longer... X-Git-Tag: 10.10.0-rc1~9 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a1bb3f113e8caba9e1da8ecdeef7f41850d67f92;p=thirdparty%2Fasterisk.git Fix a regression from direct media ACLs where the directrtpsetup option no longer works. A check was added for direct media ACLs that immediately forbid remote bridging if there was no bridged channel. This caused directrtpsetup to no longer function as it needs this information before bridging actually occurs. Logic has now been adjusted so if there is no bridged channel a remote bridge will still be attempted. (closes issue ASTERISK-20511) Reported by: kristoff Review: https://reviewboard.asterisk.org/r/2146/ ........ Merged revisions 374456 from http://svn.asterisk.org/svn/asterisk/branches/1.8 git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/10@374457 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 7adcad1ec9..a6a557f800 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -30320,22 +30320,22 @@ static enum ast_rtp_glue_result sip_get_rtp_peer(struct ast_channel *chan, struc return AST_RTP_GLUE_RESULT_FORBID; } - if (!(opp_chan = ast_bridged_channel(chan))) { - return AST_RTP_GLUE_RESULT_FORBID; - } else if (((opp_chan->tech != &sip_tech) && (opp_chan->tech != &sip_tech_info)) || - (!(opp = opp_chan->tech_pvt))) { + if ((opp_chan = ast_bridged_channel(chan)) && (((opp_chan->tech != &sip_tech) && (opp_chan->tech != &sip_tech_info)) || + (!(opp = opp_chan->tech_pvt)))) { return AST_RTP_GLUE_RESULT_FORBID; } sip_pvt_lock(p); - while (sip_pvt_trylock(opp)) { + while (opp && sip_pvt_trylock(opp)) { sip_pvt_unlock(p); usleep(1); sip_pvt_lock(p); } if (!(p->rtp)) { - sip_pvt_unlock(opp); + if (opp) { + sip_pvt_unlock(opp); + } sip_pvt_unlock(p); return AST_RTP_GLUE_RESULT_FORBID; } @@ -30345,7 +30345,7 @@ static enum ast_rtp_glue_result sip_get_rtp_peer(struct ast_channel *chan, struc if (ast_test_flag(&p->flags[0], SIP_DIRECT_MEDIA)) { res = AST_RTP_GLUE_RESULT_REMOTE; - if (!apply_directmedia_ha(p, opp, "audio")) { + if (opp && !apply_directmedia_ha(p, opp, "audio")) { res = AST_RTP_GLUE_RESULT_FORBID; } } else if (ast_test_flag(&p->flags[0], SIP_DIRECT_MEDIA_NAT)) { @@ -30354,7 +30354,9 @@ static enum ast_rtp_glue_result sip_get_rtp_peer(struct ast_channel *chan, struc res = AST_RTP_GLUE_RESULT_FORBID; } - sip_pvt_unlock(opp); + if (opp) { + sip_pvt_unlock(opp); + } if (p->srtp) { res = AST_RTP_GLUE_RESULT_FORBID; @@ -30376,22 +30378,22 @@ static enum ast_rtp_glue_result sip_get_vrtp_peer(struct ast_channel *chan, stru return AST_RTP_GLUE_RESULT_FORBID; } - if (!(opp_chan = ast_bridged_channel(chan))) { - return AST_RTP_GLUE_RESULT_FORBID; - } else if (((opp_chan->tech != &sip_tech) && (opp_chan->tech != &sip_tech_info)) || - (!(opp = opp_chan->tech_pvt))) { + if ((opp_chan = ast_bridged_channel(chan)) && (((opp_chan->tech != &sip_tech) && (opp_chan->tech != &sip_tech_info)) || + (!(opp = opp_chan->tech_pvt)))) { return AST_RTP_GLUE_RESULT_FORBID; } sip_pvt_lock(p); - while (sip_pvt_trylock(opp)) { + while (opp && sip_pvt_trylock(opp)) { sip_pvt_unlock(p); usleep(1); sip_pvt_lock(p); } if (!(p->vrtp)) { - sip_pvt_unlock(opp); + if (opp) { + sip_pvt_unlock(opp); + } sip_pvt_unlock(p); return AST_RTP_GLUE_RESULT_FORBID; } @@ -30401,12 +30403,14 @@ static enum ast_rtp_glue_result sip_get_vrtp_peer(struct ast_channel *chan, stru if (ast_test_flag(&p->flags[0], SIP_DIRECT_MEDIA)) { res = AST_RTP_GLUE_RESULT_REMOTE; - if (!apply_directmedia_ha(p, opp, "video")) { + if (opp && !apply_directmedia_ha(p, opp, "video")) { res = AST_RTP_GLUE_RESULT_FORBID; } } - sip_pvt_unlock(opp); + if (opp) { + sip_pvt_unlock(opp); + } sip_pvt_unlock(p); return res; @@ -30423,22 +30427,22 @@ static enum ast_rtp_glue_result sip_get_trtp_peer(struct ast_channel *chan, stru return AST_RTP_GLUE_RESULT_FORBID; } - if (!(opp_chan = ast_bridged_channel(chan))) { - return AST_RTP_GLUE_RESULT_FORBID; - } else if (((opp_chan->tech != &sip_tech) && (opp_chan->tech != &sip_tech_info)) || - (!(opp = opp_chan->tech_pvt))) { + if ((opp_chan = ast_bridged_channel(chan)) && (((opp_chan->tech != &sip_tech) && (opp_chan->tech != &sip_tech_info)) || + (!(opp = opp_chan->tech_pvt)))) { return AST_RTP_GLUE_RESULT_FORBID; } sip_pvt_lock(p); - while (sip_pvt_trylock(opp)) { + while (opp && sip_pvt_trylock(opp)) { sip_pvt_unlock(p); usleep(1); sip_pvt_lock(p); } if (!(p->trtp)) { - sip_pvt_unlock(opp); + if (opp) { + sip_pvt_unlock(opp); + } sip_pvt_unlock(p); return AST_RTP_GLUE_RESULT_FORBID; } @@ -30448,12 +30452,14 @@ static enum ast_rtp_glue_result sip_get_trtp_peer(struct ast_channel *chan, stru if (ast_test_flag(&p->flags[0], SIP_DIRECT_MEDIA)) { res = AST_RTP_GLUE_RESULT_REMOTE; - if (!apply_directmedia_ha(p, opp, "text")) { + if (opp && !apply_directmedia_ha(p, opp, "text")) { res = AST_RTP_GLUE_RESULT_FORBID; } } - sip_pvt_unlock(opp); + if (opp) { + sip_pvt_unlock(opp); + } sip_pvt_unlock(p); return res;