From 6dcd9e5c292e97b7702729f874c22cc958c23b26 Mon Sep 17 00:00:00 2001 From: Stefan Sayer Date: Mon, 19 Jan 2009 17:14:00 +0000 Subject: [PATCH] fix: reject streams in SDP answer that we don't support/want reject streams offered with port 0 aswell git-svn-id: http://svn.berlios.de/svnroot/repos/sems/trunk@1226 8eb893ce-cfd4-0310-b710-fb5ebe64c474 --- core/AmSdp.cpp | 28 +++++++++++++++++++++++++--- core/AmSdp.h | 2 ++ core/AmUtils.cpp | 5 +++++ 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/core/AmSdp.cpp b/core/AmSdp.cpp index 81744661..3682fdfe 100644 --- a/core/AmSdp.cpp +++ b/core/AmSdp.cpp @@ -103,7 +103,8 @@ bool SdpPayload::operator == (int r) // AmSdp::AmSdp() : remote_active(false), - telephone_event_pt(NULL) + telephone_event_pt(NULL), + accepted_media(0) { l_origin.user = "sems"; l_origin.sessId = get_random(); @@ -118,7 +119,8 @@ AmSdp::AmSdp(const AmSdp& p_sdp_msg) conn(p_sdp_msg.conn), media(p_sdp_msg.media), telephone_event_pt(NULL), - remote_active(false) + remote_active(false), + accepted_media(0) { memcpy(r_buf,p_sdp_msg.r_buf,BUFFER_SIZE); } @@ -212,6 +214,21 @@ int AmSdp::genResponse(const string& localip, int localport, string& out_buf, bo if(remote_active /* dir == SdpMedia::DirActive */) out_buf += "a=direction:passive\r\n"; + + // add rejected media line for all except the accepted one + for( vector::iterator m_it = media.begin(); m_it != media.end(); ++m_it ){ + if ((unsigned int)(m_it - media.begin()) != accepted_media) { + string rej_line = "m=" + media_t_2_str(m_it->type) + " 0 " + + transport_p_2_str(m_it->transport); + // add one bogus payload (required by sdp) - ignored (3264 s 6) + if (m_it->payloads.size()) { + rej_line += " "+int2str(m_it->payloads[0].payload_type)+"\n"; + } else { + rej_line += " 0\n"; // violating 3264, but in this case the offer already did + } + out_buf += rej_line; + } + } return 0; } @@ -285,7 +302,9 @@ const vector& AmSdp::getCompatiblePayloads(AmPayloadProviderInterfa // DBG("media clock rates: %d\n", m_it->payloads[i].clock_rate); //} // DBG("type found: %d\n", m_it->payloads[0].t); - if( (media_type != m_it->type) ) + + // only accept our media type, and reject if port=0 (section 8.2) + if( (media_type != m_it->type) || (!m_it->port)) continue; vector::iterator it = m_it->payloads.begin(); @@ -338,6 +357,9 @@ const vector& AmSdp::getCompatiblePayloads(AmPayloadProviderInterfa remote_active = true; port = (int)m_it->port; + + // save index of accepted media + accepted_media = m_it - media.begin(); } break; } diff --git a/core/AmSdp.h b/core/AmSdp.h index 3409fa39..5262231c 100644 --- a/core/AmSdp.h +++ b/core/AmSdp.h @@ -160,6 +160,8 @@ public: // us to do passive RTP ? bool remote_active; + unsigned int accepted_media; // index of the media which we accept (todo: multi stream) + SdpOrigin l_origin; // local origin (o= ) AmSdp(); diff --git a/core/AmUtils.cpp b/core/AmUtils.cpp index 809b05cb..fc79cad8 100644 --- a/core/AmUtils.cpp +++ b/core/AmUtils.cpp @@ -978,5 +978,10 @@ void add_env_path(const char* name, const string& path) } DBG("setting %s to: '%s'\n",name,var.c_str()); +#ifndef BSD_COMP setenv(name,var.c_str(),1); +#else + string sol_putenv = name + "=" + var; + putenv(sol_putenv.c_str()); +#endif }