fix some problems when parsing SIP messages that have the maximum number of headers or body lines that we support

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@149452 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Kevin P. Fleming
2008-10-15 10:30:40 +00:00
parent 0145ae2870
commit 1573ebed8c

View File

@@ -4892,23 +4892,27 @@ static int parse_request(struct sip_request *req)
} }
if (f >= SIP_MAX_HEADERS - 1) { if (f >= SIP_MAX_HEADERS - 1) {
ast_log(LOG_WARNING, "Too many SIP headers. Ignoring.\n"); ast_log(LOG_WARNING, "Too many SIP headers. Ignoring.\n");
} else } else {
f++; f++;
req->header[f] = c + 1; req->header[f] = c + 1;
}
} else if (*c == '\r') { } else if (*c == '\r') {
/* Ignore but eliminate \r's */ /* Ignore but eliminate \r's */
*c = 0; *c = 0;
} }
c++; c++;
} }
/* Check for last header */
req->headers = f;
/* Check a non-newline-terminated last header */
if (!ast_strlen_zero(req->header[f])) { if (!ast_strlen_zero(req->header[f])) {
if (sipdebug && option_debug > 3) if (sipdebug && option_debug > 3)
ast_log(LOG_DEBUG, "Header %d: %s (%d)\n", f, req->header[f], (int) strlen(req->header[f])); ast_log(LOG_DEBUG, "Header %d: %s (%d)\n", f, req->header[f], (int) strlen(req->header[f]));
f++; req->headers++;
} }
req->headers = f;
/* Now we process any mime content */ /* Now we process any body content */
f = 0; f = 0;
req->line[f] = c; req->line[f] = c;
while (*c) { while (*c) {
@@ -4917,23 +4921,30 @@ static int parse_request(struct sip_request *req)
*c = 0; *c = 0;
if (sipdebug && option_debug > 3) if (sipdebug && option_debug > 3)
ast_log(LOG_DEBUG, "Line: %s (%d)\n", req->line[f], (int) strlen(req->line[f])); ast_log(LOG_DEBUG, "Line: %s (%d)\n", req->line[f], (int) strlen(req->line[f]));
if (f >= SIP_MAX_LINES - 1) { if (f == SIP_MAX_LINES - 1) {
ast_log(LOG_WARNING, "Too many SDP lines. Ignoring.\n"); ast_log(LOG_WARNING, "Too many SDP lines. Ignoring.\n");
} else break;
} else {
f++; f++;
req->line[f] = c + 1; req->line[f] = c + 1;
}
} else if (*c == '\r') { } else if (*c == '\r') {
/* Ignore and eliminate \r's */ /* Ignore and eliminate \r's */
*c = 0; *c = 0;
} }
c++; c++;
} }
/* Check for last line */
if (!ast_strlen_zero(req->line[f]))
f++;
req->lines = f; req->lines = f;
/* Check a non-newline-terminated last line */
if (!ast_strlen_zero(req->line[f])) {
req->lines++;
}
if (*c) if (*c)
ast_log(LOG_WARNING, "Odd content, extra stuff left over ('%s')\n", c); ast_log(LOG_WARNING, "Odd content, extra stuff left over ('%s')\n", c);
/* Split up the first line parts */ /* Split up the first line parts */
return determine_firstline_parts(req); return determine_firstline_parts(req);
} }