]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
chan_sip.c: Stop handling continuation lines after reading headers
authorSean Bright <sean.bright@gmail.com>
Thu, 16 Jan 2020 15:09:47 +0000 (10:09 -0500)
committerSean Bright <sean.bright@gmail.com>
Thu, 16 Jan 2020 15:17:24 +0000 (09:17 -0600)
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

index 7448951c308e19769193884dfb818767fd1cba55..e3b8afda18aa59d668867a3ceae5adf0f127f0c0 100644 (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;