From 1e4df0215af4f192ed06a7fc7589c799f1ec6091 Mon Sep 17 00:00:00 2001 From: Francesco Castellano Date: Fri, 28 Jun 2019 18:15:31 +0200 Subject: [PATCH] chan_sip: Handle invalid SDP answer to T.38 re-invite The chan_sip module performs a T.38 re-invite using a single media stream of udptl, and expects the SDP answer to be the same. If an SDP answer is received instead that contains an additional media stream with no joint codec a crash will occur as the code assumes that at least one joint codec will exist in this scenario. This change removes this assumption. ASTERISK-28465 Change-Id: I8b02845b53344c6babe867a3f0a5231045c7ac87 --- diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 898b646..a609ff8 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -10965,7 +10965,13 @@ ast_rtp_lookup_mime_multiple2(s3, NULL, newnoncodeccapability, 0, 0)); } - if (portno != -1 || vportno != -1 || tportno != -1) { + /* When UDPTL is negotiated it is expected that there are no compatible codecs as audio or + * video is not being transported, thus we continue in this function further up if that is + * the case. If we receive an SDP answer containing both a UDPTL stream and another media + * stream however we need to check again to ensure that there is at least one joint codec + * instead of assuming there is one. + */ + if ((portno != -1 || vportno != -1 || tportno != -1) && ast_format_cap_count(newjointcapability)) { /* We are now ready to change the sip session and RTP structures with the offered codecs, since they are acceptable */ unsigned int framing;