From d514fa3300b932e4ec9121900eb75fc529f652ce Mon Sep 17 00:00:00 2001 From: Sean Bright Date: Thu, 16 Jan 2020 10:09:47 -0500 Subject: [PATCH] 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 --- channels/chan_sip.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/channels/chan_sip.c b/channels/chan_sip.c index f90d3f90cf..5183a8a128 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -9833,8 +9833,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++; @@ -9842,11 +9844,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; @@ -9855,8 +9863,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;