diff options
Diffstat (limited to 'channels')
-rw-r--r-- | channels/chan_sip.c | 34 |
1 files changed, 25 insertions, 9 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 73a4b7400..d57acdc60 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -9114,8 +9114,12 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req, int t38action nextm = get_sdp_iterate(&next, req, "m"); /* Search for audio media definition */ - if ((sscanf(m, "audio %30u/%30u RTP/%4s %n", &x, &numberofports, protocol, &len) == 3 && len > 0 && x) || - (sscanf(m, "audio %30u RTP/%4s %n", &x, protocol, &len) == 2 && len > 0 && x)) { + if ((sscanf(m, "audio %30u/%30u RTP/%4s %n", &x, &numberofports, protocol, &len) == 3 && len > 0) || + (sscanf(m, "audio %30u RTP/%4s %n", &x, protocol, &len) == 2 && len > 0)) { + if (x == 0) { + ast_log(LOG_WARNING, "ignoring 'audio' media offer because port number is zero"); + continue; + } if (!strcmp(protocol, "SAVP")) { secure_audio = 1; } else if (strcmp(protocol, "AVP")) { @@ -9142,12 +9146,16 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req, int t38action } if (debug) ast_verbose("Found RTP audio format %d\n", codec); - + ast_rtp_codecs_payloads_set_m_type(&newaudiortp, NULL, codec); } /* Search for video media definition */ - } else if ((sscanf(m, "video %30u/%30u RTP/%4s %n", &x, &numberofports, protocol, &len) == 3 && len > 0 && x) || - (sscanf(m, "video %30u RTP/%4s %n", &x, protocol, &len) == 2 && len >= 0 && x)) { + } else if ((sscanf(m, "video %30u/%30u RTP/%4s %n", &x, &numberofports, protocol, &len) == 3 && len > 0) || + (sscanf(m, "video %30u RTP/%4s %n", &x, protocol, &len) == 2 && len > 0)) { + if (x == 0) { + ast_log(LOG_WARNING, "ignoring 'video' media offer because port number is zero"); + continue; + } if (!strcmp(protocol, "SAVP")) { secure_video = 1; } else if (strcmp(protocol, "AVP")) { @@ -9178,8 +9186,12 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req, int t38action ast_rtp_codecs_payloads_set_m_type(&newvideortp, NULL, codec); } /* Search for text media definition */ - } else if ((sscanf(m, "text %30u/%30u RTP/AVP %n", &x, &numberofports, &len) == 2 && len > 0 && x) || - (sscanf(m, "text %30u RTP/AVP %n", &x, &len) == 1 && len > 0 && x)) { + } else if ((sscanf(m, "text %30u/%30u RTP/AVP %n", &x, &numberofports, &len) == 2 && len > 0) || + (sscanf(m, "text %30u RTP/AVP %n", &x, &len) == 1 && len > 0)) { + if (x == 0) { + ast_log(LOG_WARNING, "ignoring 'text' media offer because port number is zero"); + continue; + } if (p->offered_media[SDP_TEXT].order_offered) { ast_log(LOG_WARNING, "Multiple text streams are not supported\n"); res = -3; @@ -9204,8 +9216,12 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req, int t38action ast_rtp_codecs_payloads_set_m_type(&newtextrtp, NULL, codec); } /* Search for image media definition */ - } else if (((sscanf(m, "image %30u udptl t38%n", &x, &len) == 1 && len > 0 && x) || - (sscanf(m, "image %30u UDPTL t38%n", &x, &len) == 1 && len > 0 && x) )) { + } else if (((sscanf(m, "image %30u udptl t38%n", &x, &len) == 1 && len > 0) || + (sscanf(m, "image %30u UDPTL t38%n", &x, &len) == 1 && len > 0))) { + if (x == 0) { + ast_log(LOG_WARNING, "ignoring 'image' media offer because port number is zero"); + continue; + } if (initialize_udptl(p)) { continue; } |