[asterisk-commits] file: branch 1.8 r374456 - /branches/1.8/channels/chan_sip.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Thu Oct 4 12:39:25 CDT 2012


Author: file
Date: Thu Oct  4 12:39:18 2012
New Revision: 374456

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=374456
Log:
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/

Modified:
    branches/1.8/channels/chan_sip.c

Modified: branches/1.8/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/channels/chan_sip.c?view=diff&rev=374456&r1=374455&r2=374456
==============================================================================
--- branches/1.8/channels/chan_sip.c (original)
+++ branches/1.8/channels/chan_sip.c Thu Oct  4 12:39:18 2012
@@ -29370,22 +29370,22 @@
 		return AST_RTP_GLUE_RESULT_FORBID;
 	}
 
-	if (!(opp_chan = ast_bridged_channel(chan))) {
+	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;
-	} else if (((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;
 	}
@@ -29395,7 +29395,7 @@
 
 	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)) {
@@ -29404,7 +29404,9 @@
 		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;
@@ -29426,22 +29428,22 @@
 		return AST_RTP_GLUE_RESULT_FORBID;
 	}
 
-	if (!(opp_chan = ast_bridged_channel(chan))) {
+	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;
-	} else if (((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;
 	}
@@ -29451,12 +29453,14 @@
 
 	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;
@@ -29473,22 +29477,22 @@
 		return AST_RTP_GLUE_RESULT_FORBID;
 	}
 
-	if (!(opp_chan = ast_bridged_channel(chan))) {
+	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;
-	} else if (((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;
 	}
@@ -29498,12 +29502,14 @@
 
 	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;




More information about the asterisk-commits mailing list