From: Olle Johansson Date: Wed, 30 Apr 2008 16:23:17 +0000 (+0000) Subject: Don't crash on bad SIP replys. X-Git-Tag: 1.4.20-rc1~5 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=26fc3d5ac6fe04b9acbd8bd1e9d18ef47bbee600;p=thirdparty%2Fasterisk.git Don't crash on bad SIP replys. 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 --- diff --git a/channels/chan_sip.c b/channels/chan_sip.c index e3fab92323..8bf290a637 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -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))