From afa876c30302b7f74c666e754b3b80dcc78a3ef5 Mon Sep 17 00:00:00 2001 From: Automerge script Date: Thu, 4 Oct 2012 18:23:00 +0000 Subject: [PATCH] Merged revisions 374457 via svnmerge from file:///srv/subversion/repos/asterisk/branches/10 ................ r374457 | file | 2012-10-04 12:44:38 -0500 (Thu, 04 Oct 2012) | 17 lines 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-digiumphones@374474 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_sip.c | 54 +++++++++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/channels/chan_sip.c b/channels/chan_sip.c index def30b5e87..725314702f 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -30489,22 +30489,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; } @@ -30514,7 +30514,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)) { @@ -30523,7 +30523,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; @@ -30545,22 +30547,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; } @@ -30570,12 +30572,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; @@ -30592,22 +30596,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; } @@ -30617,12 +30621,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; -- 2.47.2