]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
AST-2013-005: Fix crash caused by invalid SDP
authorMatthew Jordan <mjordan@digium.com>
Tue, 27 Aug 2013 18:03:08 +0000 (18:03 +0000)
committerMatthew Jordan <mjordan@digium.com>
Tue, 27 Aug 2013 18:03:08 +0000 (18:03 +0000)
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
........

Merged revisions 397757 from http://svn.asterisk.org/svn/asterisk/branches/10

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/11@397758 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_sip.c

index ae9c0a46d2900e72b14f132ce0ed4694f48995bf..49f2a3867a32e183e61f45a07213b2201f6dadf6 100644 (file)
@@ -10566,7 +10566,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) {
                        start_ice(p->rtp);
                        ast_sockaddr_set_port(sa, portno);
                        ast_rtp_instance_set_remote_address(p->rtp, sa);
@@ -10614,7 +10614,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) {
                        start_ice(p->vrtp);
                        ast_sockaddr_set_port(vsa, vportno);
                        ast_rtp_instance_set_remote_address(p->vrtp, vsa);
@@ -10632,7 +10632,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) {
                        start_ice(p->trtp);
                        ast_sockaddr_set_port(tsa, tportno);
                        ast_rtp_instance_set_remote_address(p->trtp, tsa);
@@ -10656,7 +10656,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) {