]> source.dussan.org Git - rspamd.git/commitdiff
[Fix] Fix some border cases for DKIM canonicalization
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 22 Aug 2016 14:23:49 +0000 (15:23 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 22 Aug 2016 14:29:40 +0000 (15:29 +0100)
Issue: #880

src/libserver/dkim.c

index 51f366179415c98f3108843c7c8ee53a4dcfc94f..d38fe6cb1e4bac10b5c352b261cbccfcd07ec6d4 100644 (file)
@@ -1316,7 +1316,7 @@ rspamd_dkim_skip_empty_lines (const gchar *start, const gchar *end,
        } state = init;
        guint skip = 0;
 
-       while (p >= start + 2) {
+       while (p >= start + 1) {
                switch (state) {
                case init:
                        if (*p == '\r') {
@@ -1353,44 +1353,60 @@ rspamd_dkim_skip_empty_lines (const gchar *start, const gchar *end,
                        }
                        break;
                case got_cr:
-                       if (*(p - 1) == '\r') {
-                               p --;
-                               state = got_cr;
-                       }
-                       else if (*(p - 1) == '\n') {
-                               if ((*p - 2) == '\r') {
-                                       /* \r\n\r -> we know about one line */
-                                       p -= 1;
-                                       state = got_crlf;
+                       if (p > start - 1) {
+                               if (*(p - 1) == '\r') {
+                                       p --;
+                                       state = got_cr;
+                               }
+                               else if (*(p - 1) == '\n') {
+                                       if ((*p - 2) == '\r') {
+                                               /* \r\n\r -> we know about one line */
+                                               p -= 1;
+                                               state = got_crlf;
+                                       }
+                                       else {
+                                               /* \n\r -> we know about one line */
+                                               p -= 1;
+                                               state = got_lf;
+                                       }
+                               }
+                               else if (type == DKIM_CANON_RELAXED && *(p - 1) == ' ') {
+                                       skip = 1;
+                                       state = test_spaces;
                                }
                                else {
-                                       /* \n\r -> we know about one line */
-                                       p -= 1;
-                                       state = got_lf;
+                                       goto end;
                                }
                        }
-                       else if (type == DKIM_CANON_RELAXED && *(p - 1) == ' ') {
-                               skip = 1;
-                               state = test_spaces;
-                       }
                        else {
+                               if (type == DKIM_CANON_RELAXED) {
+                                       p -= 1;
+                               }
                                goto end;
                        }
                        break;
                case got_lf:
-                       if (*(p - 1) == '\r') {
-                               state = got_crlf;
-                       }
-                       else if (*(p - 1) == '\n') {
-                               /* We know about one line */
-                               p --;
-                               state = got_lf;
-                       }
-                       else if (type == DKIM_CANON_RELAXED && *(p - 1) == ' ') {
-                               skip = 1;
-                               state = test_spaces;
+                       if (p > start - 1) {
+                               if (*(p - 1) == '\r') {
+                                       state = got_crlf;
+                               }
+                               else if (*(p - 1) == '\n') {
+                                       /* We know about one line */
+                                       p --;
+                                       state = got_lf;
+                               }
+                               else if (type == DKIM_CANON_RELAXED && *(p - 1) == ' ') {
+                                       skip = 1;
+                                       state = test_spaces;
+                               }
+                               else {
+                                       goto end;
+                               }
                        }
                        else {
+                               if (type == DKIM_CANON_RELAXED) {
+                                       p -= 1;
+                               }
                                goto end;
                        }
                        break;
@@ -1413,6 +1429,9 @@ rspamd_dkim_skip_empty_lines (const gchar *start, const gchar *end,
                                }
                        }
                        else {
+                               if (type == DKIM_CANON_RELAXED) {
+                                       p -= 2;
+                               }
                                goto end;
                        }
                        break;