]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Fix a regression from direct media ACLs where the directrtpsetup option no longer...
authorJoshua Colp <jcolp@digium.com>
Thu, 4 Oct 2012 17:44:38 +0000 (17:44 +0000)
committerJoshua Colp <jcolp@digium.com>
Thu, 4 Oct 2012 17:44:38 +0000 (17:44 +0000)
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

channels/chan_sip.c

index 7adcad1ec9ba5dc595a20b8be14c4a9d1846da71..a6a557f800d5dbc79aed14307099518ad9b88798 100644 (file)
@@ -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;