Module: sems
Branch: master
Commit: 4b135a5c3e36d3289cf44219e5d776d8b7691106
URL:    
http://git.sip-router.org/cgi-bin/gitweb.cgi/sems/?a=commit;h=4b135a5c3e36d3289cf44219e5d776d8b7691106

Author: Stefan Sayer <[email protected]>
Committer: Stefan Sayer <[email protected]>
Date:   Tue Aug 16 21:13:09 2011 +0200

b/f: some more caution handling broken SDP messages

---

 core/AmSdp.cpp |   54 ++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 36 insertions(+), 18 deletions(-)

diff --git a/core/AmSdp.cpp b/core/AmSdp.cpp
index 9fffa04..6554b44 100644
--- a/core/AmSdp.cpp
+++ b/core/AmSdp.cpp
@@ -514,10 +514,13 @@ static void parse_sdp_media(AmSdp* sdp_msg, char* s)
     case MEDIA: 
       {
       next = parse_until(media_line, ' ');
-      string media(media_line, int(next-media_line)-1);
-      if(media_type(media) < 0 )
-       ERROR("parse_sdp_media: Unknown media type\n");
+      string media;
+      if (next > media_line)
+       media = string(media_line, int(next-media_line)-1);
       m.type = media_type(media);
+      if(m.type < 0) {
+       ERROR("parse_sdp_media: Unknown media type\n");
+      }
       media_line = next;
       state = PORT;
       break;
@@ -529,17 +532,23 @@ static void parse_sdp_media(AmSdp* sdp_msg, char* s)
       if(contains(media_line, next, '/')){
        //port number
        next = parse_until(media_line, '/');
-       string port(media_line, int(next-media_line)-1);
+       string port;
+       if (next > media_line)
+         port = string(media_line, int(next-media_line)-1);
        str2i(port, m.port);    
        //number of ports
        media_line = next;
        next = parse_until(media_line, ' ');
-               string nports(media_line, int(next-media_line)-1);
+       string nports;
+       if (next > media_line)
+         nports = string(media_line, int(next-media_line)-1);
        str2i(nports, m.nports);
       }else{
        //port number 
        next = parse_until(media_line, ' ');
-       const string port(media_line, int(next-media_line)-1);
+       string port;
+       if (next > media_line)
+         port = string(media_line, int(next-media_line)-1);
        str2i(port, m.port);
        media_line = next;
       }
@@ -549,7 +558,9 @@ static void parse_sdp_media(AmSdp* sdp_msg, char* s)
     case PROTO:
       {
        next = parse_until(media_line, ' ');
-       string proto(media_line, int(next-media_line)-1);
+       string proto;
+       if (next > media_line)
+         proto = string(media_line, int(next-media_line)-1);
        // if(transport_type(proto) < 0){
        //   ERROR("parse_sdp_media: Unknown transport protocol\n");
        //   state = FMT;
@@ -567,21 +578,28 @@ static void parse_sdp_media(AmSdp* sdp_msg, char* s)
       {
        if (contains(media_line, line_end, ' ')) {
          next = parse_until(media_line, ' ');
-       //if(next < line_end){
-         string value(media_line, int(next-media_line)-1);
+         string value;
+         if (next > media_line)
+           value = string(media_line, int(next-media_line)-1);
+
+         if (!value.empty()) {
+           payload.type = m.type;
+           str2i(value, payload_type);
+           payload.payload_type = payload_type;
+           m.payloads.push_back(payload);
+         }
+
          media_line = next;
-         payload.type = m.type;
-         str2i(value, payload_type);
-         payload.payload_type = payload_type;
-         m.payloads.push_back(payload);
          state = FMT;
        } else {
          string last_value;
-         if (*line_end == '\0') {
-           // last line in message
-           last_value = string(media_line, int(line_end-media_line));
-         } else {
-           last_value = string(media_line, int(line_end-media_line)-1);
+         if (line_end>media_line) {
+           if (*line_end == '\0') {
+             // last line in message
+             last_value = string(media_line, int(line_end-media_line));
+           } else {
+             last_value = string(media_line, int(line_end-media_line)-1);
+           }
          }
          if (!last_value.empty()) {
            payload.type = m.type;

_______________________________________________
Semsdev mailing list
[email protected]
http://lists.iptel.org/mailman/listinfo/semsdev

Reply via email to