[asterisk-commits] jrose: branch 10 r366591 - in /branches/10: ./ channels/chan_sip.c
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Tue May 15 15:45:11 CDT 2012
Author: jrose
Date: Tue May 15 15:44:59 2012
New Revision: 366591
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=366591
Log:
chan_sip: Check the right channel's host address for permit/denydirectmedia
Prior to this patch, when checking the addresses for permitdirectmedia and
denydirectmedia, Asterisk would stupidly check the host address of the channel
permit/deny was specified for rendering the feature useless (or at least
redundant to turning on/off directmedia) (the approach in trunk is going to
be somewhat different)
Review: https://reviewboard.asterisk.org/r/1899/
........
Merged revisions 366547 from http://svn.asterisk.org/svn/asterisk/branches/1.8
Modified:
branches/10/ (props changed)
branches/10/channels/chan_sip.c
Propchange: branches/10/
------------------------------------------------------------------------------
Binary property 'branch-1.8-merged' - no diff available.
Modified: branches/10/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/branches/10/channels/chan_sip.c?view=diff&rev=366591&r1=366590&r2=366591
==============================================================================
--- branches/10/channels/chan_sip.c (original)
+++ branches/10/channels/chan_sip.c Tue May 15 15:44:59 2012
@@ -29965,15 +29965,15 @@
return 0;
}
-static int apply_directmedia_ha(struct sip_pvt *p, const char *op)
+static int apply_directmedia_ha(struct sip_pvt *p1, struct sip_pvt *p2, const char *op)
{
struct ast_sockaddr us = { { 0, }, }, them = { { 0, }, };
int res = AST_SENSE_ALLOW;
- ast_rtp_instance_get_remote_address(p->rtp, &them);
- ast_rtp_instance_get_local_address(p->rtp, &us);
-
- if ((res = ast_apply_ha(p->directmediaha, &them)) == AST_SENSE_DENY) {
+ ast_rtp_instance_get_remote_address(p1->rtp, &them);
+ ast_rtp_instance_get_local_address(p1->rtp, &us);
+
+ if ((res = ast_apply_ha(p2->relatedpeer->directmediaha, &them)) == AST_SENSE_DENY) {
const char *us_addr = ast_strdupa(ast_sockaddr_stringify(&us));
const char *them_addr = ast_strdupa(ast_sockaddr_stringify(&them));
@@ -29987,16 +29987,24 @@
static struct ast_udptl *sip_get_udptl_peer(struct ast_channel *chan)
{
struct sip_pvt *p;
+ struct ast_channel *opp_chan;
+ struct sip_pvt *opp;
struct ast_udptl *udptl = NULL;
-
+
p = chan->tech_pvt;
if (!p) {
return NULL;
}
-
+
+ if (!(opp_chan = ast_bridged_channel(chan))) {
+ return NULL;
+ } else if ((opp_chan->tech != &sip_tech) || (!(opp = opp_chan->tech_pvt))) {
+ return NULL;
+ }
+
sip_pvt_lock(p);
if (p->udptl && ast_test_flag(&p->flags[0], SIP_DIRECT_MEDIA)) {
- if (apply_directmedia_ha(p, "UDPTL T.38 data")) {
+ if (apply_directmedia_ha(p, opp, "UDPTL T.38 data")) {
udptl = p->udptl;
}
}
@@ -30050,9 +30058,17 @@
static enum ast_rtp_glue_result sip_get_rtp_peer(struct ast_channel *chan, struct ast_rtp_instance **instance)
{
struct sip_pvt *p = NULL;
+ struct ast_channel *opp_chan;
+ struct sip_pvt *opp = NULL;
enum ast_rtp_glue_result res = AST_RTP_GLUE_RESULT_LOCAL;
if (!(p = chan->tech_pvt)) {
+ 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 = opp_chan->tech_pvt))) {
return AST_RTP_GLUE_RESULT_FORBID;
}
@@ -30067,7 +30083,7 @@
if (ast_test_flag(&p->flags[0], SIP_DIRECT_MEDIA)) {
res = AST_RTP_GLUE_RESULT_REMOTE;
- if (!apply_directmedia_ha(p, "audio")) {
+ if (!apply_directmedia_ha(p, opp, "audio")) {
res = AST_RTP_GLUE_RESULT_FORBID;
}
} else if (ast_test_flag(&p->flags[0], SIP_DIRECT_MEDIA_NAT)) {
@@ -30088,9 +30104,17 @@
static enum ast_rtp_glue_result sip_get_vrtp_peer(struct ast_channel *chan, struct ast_rtp_instance **instance)
{
struct sip_pvt *p = NULL;
+ struct ast_channel *opp_chan;
+ struct sip_pvt *opp = NULL;
enum ast_rtp_glue_result res = AST_RTP_GLUE_RESULT_FORBID;
if (!(p = chan->tech_pvt)) {
+ 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 = opp_chan->tech_pvt))) {
return AST_RTP_GLUE_RESULT_FORBID;
}
@@ -30105,7 +30129,7 @@
if (ast_test_flag(&p->flags[0], SIP_DIRECT_MEDIA)) {
res = AST_RTP_GLUE_RESULT_REMOTE;
- if (!apply_directmedia_ha(p, "video")) {
+ if (!apply_directmedia_ha(p, opp, "video")) {
res = AST_RTP_GLUE_RESULT_FORBID;
}
}
@@ -30118,9 +30142,17 @@
static enum ast_rtp_glue_result sip_get_trtp_peer(struct ast_channel *chan, struct ast_rtp_instance **instance)
{
struct sip_pvt *p = NULL;
+ struct ast_channel *opp_chan;
+ struct sip_pvt *opp = NULL;
enum ast_rtp_glue_result res = AST_RTP_GLUE_RESULT_FORBID;
if (!(p = chan->tech_pvt)) {
+ 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 = opp_chan->tech_pvt))) {
return AST_RTP_GLUE_RESULT_FORBID;
}
@@ -30135,7 +30167,7 @@
if (ast_test_flag(&p->flags[0], SIP_DIRECT_MEDIA)) {
res = AST_RTP_GLUE_RESULT_REMOTE;
- if (!apply_directmedia_ha(p, "text")) {
+ if (!apply_directmedia_ha(p, opp, "text")) {
res = AST_RTP_GLUE_RESULT_FORBID;
}
}
More information about the asterisk-commits
mailing list