[asterisk-commits] jrose: branch 1.8 r366547 - /branches/1.8/channels/chan_sip.c
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Tue May 15 15:14:12 CDT 2012
Author: jrose
Date: Tue May 15 15:14:05 2012
New Revision: 366547
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=366547
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/
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=366547&r1=366546&r2=366547
==============================================================================
--- branches/1.8/channels/chan_sip.c (original)
+++ branches/1.8/channels/chan_sip.c Tue May 15 15:14:05 2012
@@ -29045,15 +29045,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));
@@ -29067,16 +29067,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;
}
}
@@ -29130,9 +29138,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;
}
@@ -29147,7 +29163,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)) {
@@ -29168,9 +29184,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;
}
@@ -29185,7 +29209,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;
}
}
@@ -29198,9 +29222,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;
}
@@ -29215,7 +29247,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