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
10
Joshua Colp 13 years ago
parent 6e8880d697
commit a1bb3f113e

@ -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;

Loading…
Cancel
Save