summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Joseph <gjoseph@digium.com>2017-09-21 08:47:11 -0600
committerGeorge Joseph <gjoseph@digium.com>2017-09-22 06:02:09 -0600
commit962865d4ee58d6eb99664575cc537340d0591b29 (patch)
tree986e9609e1e37b779ada0649f558e3468810ce7b
parent90b68dd54b57cc83c5fe773a012a485c12fff27b (diff)
res_pjsip_session/BUNDLE: Handle no audio codecs on endpoint
When an INVITE came in with both audio and video streams but there were no audio codecs defined for the endpoint, we weren't declining the audio stream. Since it's usually the first/transport stream, when the video stream was processed and tried to use the transport, it was empty and caused a crash. We now decline the the stream if there are no matching codecs so when the video stream is processed, it's now the first/transport stream and processes normally. Change-Id: Ic854eda54c95031e66b076ecfae3041d34daa692
-rw-r--r--res/res_pjsip_session.c27
1 files changed, 22 insertions, 5 deletions
diff --git a/res/res_pjsip_session.c b/res/res_pjsip_session.c
index c3f929e4c..9c15d23f1 100644
--- a/res/res_pjsip_session.c
+++ b/res/res_pjsip_session.c
@@ -549,6 +549,16 @@ static int set_mid_and_bundle_group(struct ast_sip_session *session,
return 0;
}
+static void remove_stream_from_bundle(struct ast_sip_session_media *session_media,
+ struct ast_stream *stream)
+{
+ ast_stream_set_state(stream, AST_STREAM_STATE_REMOVED);
+ ast_free(session_media->mid);
+ session_media->mid = NULL;
+ session_media->bundle_group = -1;
+ session_media->bundled = 0;
+}
+
static int handle_incoming_sdp(struct ast_sip_session *session, const pjmedia_sdp_session *sdp)
{
int i;
@@ -611,9 +621,7 @@ static int handle_incoming_sdp(struct ast_sip_session *session, const pjmedia_sd
if (!remote_stream->desc.port || is_stream_limitation_reached(type, session->endpoint, type_streams)) {
ast_debug(1, "Declining incoming SDP media stream '%s' at position '%d'\n",
ast_codec_media_type2str(type), i);
- ast_stream_set_state(stream, AST_STREAM_STATE_REMOVED);
- session_media->bundle_group = -1;
- session_media->bundled = 0;
+ remove_stream_from_bundle(session_media, stream);
continue;
}
@@ -628,6 +636,11 @@ static int handle_incoming_sdp(struct ast_sip_session *session, const pjmedia_sd
if (res < 0) {
/* Catastrophic failure. Abort! */
return -1;
+ } else if (res == 0) {
+ ast_debug(1, "Declining incoming SDP media stream '%s' at position '%d'\n",
+ ast_codec_media_type2str(type), i);
+ remove_stream_from_bundle(session_media, stream);
+ continue;
} else if (res > 0) {
ast_debug(1, "Media stream '%s' handled by %s\n",
ast_codec_media_type2str(session_media->type),
@@ -655,8 +668,12 @@ static int handle_incoming_sdp(struct ast_sip_session *session, const pjmedia_sd
if (res < 0) {
/* Catastrophic failure. Abort! */
return -1;
- }
- if (res > 0) {
+ } else if (res == 0) {
+ ast_debug(1, "Declining incoming SDP media stream '%s' at position '%d'\n",
+ ast_codec_media_type2str(type), i);
+ remove_stream_from_bundle(session_media, stream);
+ continue;
+ } else if (res > 0) {
ast_debug(1, "Media stream '%s' handled by %s\n",
ast_codec_media_type2str(session_media->type),
handler->id);