From 685d8207c427419485e24bf48fe161dfcd3304ed Mon Sep 17 00:00:00 2001 From: Matthew Jordan Date: Tue, 27 Aug 2013 17:57:03 +0000 Subject: [PATCH] AST-2013-005: Fix crash caused by invalid SDP If the SIP channel driver processes an invalid SDP that defines media descriptions before connection information, it may attempt to reference the socket address information even though that information has not yet been set. This will cause a crash. This patch adds checks when handling the various media descriptions that ensures the media descriptions are handled only if we have connection information suitable for that media. Thanks to Walter Doekes, OSSO B.V., for reporting, testing, and providing the solution to this problem. (closes issue ASTERISK-22007) Reported by: wdoekes Tested by: wdoekes patches: issueA22007_sdp_without_c_death.patch uploaded by wdoekes (License 5674) ........ Merged revisions 397756 from http://svn.asterisk.org/svn/asterisk/branches/1.8 git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/10@397757 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_sip.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/channels/chan_sip.c b/channels/chan_sip.c index ac9b4fa5ea..750ac6acf1 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -9920,7 +9920,7 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req, int t38action /* Setup audio address and port */ if (p->rtp) { - if (portno > 0) { + if (sa && portno > 0) { ast_sockaddr_set_port(sa, portno); ast_rtp_instance_set_remote_address(p->rtp, sa); if (debug) { @@ -9967,7 +9967,7 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req, int t38action /* Setup video address and port */ if (p->vrtp) { - if (vportno > 0) { + if (vsa && vportno > 0) { ast_sockaddr_set_port(vsa, vportno); ast_rtp_instance_set_remote_address(p->vrtp, vsa); if (debug) { @@ -9984,7 +9984,7 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req, int t38action /* Setup text address and port */ if (p->trtp) { - if (tportno > 0) { + if (tsa && tportno > 0) { ast_sockaddr_set_port(tsa, tportno); ast_rtp_instance_set_remote_address(p->trtp, tsa); if (debug) { @@ -10007,7 +10007,7 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req, int t38action /* Setup image address and port */ if (p->udptl) { - if (udptlportno > 0) { + if (isa && udptlportno > 0) { if (ast_test_flag(&p->flags[1], SIP_PAGE2_SYMMETRICRTP) && ast_test_flag(&p->flags[1], SIP_PAGE2_UDPTL_DESTINATION)) { ast_rtp_instance_get_remote_address(p->rtp, isa); if (!ast_sockaddr_isnull(isa) && debug) {