]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Don't crash on bad SIP replys.
authorOlle Johansson <oej@edvina.net>
Wed, 30 Apr 2008 16:23:17 +0000 (16:23 +0000)
committerOlle Johansson <oej@edvina.net>
Wed, 30 Apr 2008 16:23:17 +0000 (16:23 +0000)
Fix created in Huntsville together with Mark M (putnopvut)

(closes issue #12363)
Reported by: jvandal
Tested by: putnopvut, oej

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

channels/chan_sip.c

index e3fab92323c4c21d83f03ea99677028e2979f076..8bf290a637e2e0c37d428ee56ff6f1033ca32c2b 100644 (file)
@@ -1460,7 +1460,7 @@ static const char *gettag(const struct sip_request *req, const char *header, cha
 static void set_insecure_flags(struct ast_flags *flags, const char *value, int lineno);
 static int find_sip_method(const char *msg);
 static unsigned int parse_sip_options(struct sip_pvt *pvt, const char *supported);
-static void parse_request(struct sip_request *req);
+static int parse_request(struct sip_request *req);
 static const char *get_header(const struct sip_request *req, const char *name);
 static char *referstatus2str(enum referstatus rstatus) attribute_pure;
 static int method_match(enum sipmethod id, const char *name);
@@ -4811,7 +4811,7 @@ static int lws2sws(char *msgbuf, int len)
 /*! \brief Parse a SIP message 
        \note this function is used both on incoming and outgoing packets
 */
-static void parse_request(struct sip_request *req)
+static int parse_request(struct sip_request *req)
 {
        /* Divide fields by NULL's */
        char *c;
@@ -4878,7 +4878,7 @@ static void parse_request(struct sip_request *req)
        if (*c) 
                ast_log(LOG_WARNING, "Odd content, extra stuff left over ('%s')\n", c);
        /* Split up the first line parts */
-       determine_firstline_parts(req);
+       return determine_firstline_parts(req);
 }
 
 /*!
@@ -15497,7 +15497,9 @@ static int sipsock_read(int *id, int fd, short events, void *ignore)
        if (ast_test_flag(&req, SIP_PKT_DEBUG))
                ast_verbose("\n<--- SIP read from %s:%d --->\n%s\n<------------->\n", ast_inet_ntoa(sin.sin_addr), ntohs(sin.sin_port), req.data);
 
-       parse_request(&req);
+       if(parse_request(&req) == -1) /* Bad packet, can't parse */
+               return 1;
+
        req.method = find_sip_method(req.rlPart1);
 
        if (ast_test_flag(&req, SIP_PKT_DEBUG))