From f309b86e36738d2002c4f48a900e74c22be1a14a Mon Sep 17 00:00:00 2001 From: Sean Bright <sean.bright@gmail.com> 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 7448951c30..e3b8afda18 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -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; -- GitLab