]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 374457 via svnmerge from
authorAutomerge script <automerge@asterisk.org>
Thu, 4 Oct 2012 18:23:00 +0000 (18:23 +0000)
committerAutomerge script <automerge@asterisk.org>
Thu, 4 Oct 2012 18:23:00 +0000 (18:23 +0000)
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

index def30b5e87d914d48b2d66c5f70450daf7d29552..725314702f1c2470b32c03497391a0d5d8e8d5fb 100644 (file)
@@ -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;