chan_sip.c: Stop handling continuation lines after reading headers

lws2sws() does not stop trying to handle header continuation lines
even after all headers have been found. This is problematic if the
first character of a SIP message body is a space or tab character, so
we update to recognize the end of the message header.

ASTERISK-28693 #close
Reported by: Frank Matano

Change-Id: Idec8fa58545cd3fd898cbe0075d76c223f8d33df
This commit is contained in:
Sean Bright 2020-01-16 10:09:47 -05:00
parent c5fc1bf39f
commit 31027f33db
1 changed files with 14 additions and 3 deletions

View File

@ -9869,8 +9869,10 @@ static void lws2sws(struct ast_str *data)
int len = ast_str_strlen(data);
int h = 0, t = 0;
int lws = 0;
int just_read_eol = 0;
int done_with_headers = 0;
for (; h < len;) {
while (h < len) {
/* Eliminate all CRs */
if (msgbuf[h] == '\r') {
h++;
@ -9878,11 +9880,17 @@ static void lws2sws(struct ast_str *data)
}
/* Check for end-of-line */
if (msgbuf[h] == '\n') {
if (just_read_eol) {
done_with_headers = 1;
} else {
just_read_eol = 1;
}
/* Check for end-of-message */
if (h + 1 == len)
break;
/* Check for a continuation line */
if (msgbuf[h + 1] == ' ' || msgbuf[h + 1] == '\t') {
if (!done_with_headers
&& (msgbuf[h + 1] == ' ' || msgbuf[h + 1] == '\t')) {
/* Merge continuation line */
h++;
continue;
@ -9891,8 +9899,11 @@ static void lws2sws(struct ast_str *data)
msgbuf[t++] = msgbuf[h++];
lws = 0;
continue;
} else {
just_read_eol = 0;
}
if (msgbuf[h] == ' ' || msgbuf[h] == '\t') {
if (!done_with_headers
&& (msgbuf[h] == ' ' || msgbuf[h] == '\t')) {
if (lws) {
h++;
continue;