Browse Source

[Fix] Fix some border cases for DKIM canonicalization

Issue: #880
tags/1.3.4
Vsevolod Stakhov 7 years ago
parent
commit
2a1876dd1c
1 changed files with 47 additions and 28 deletions
  1. 47
    28
      src/libserver/dkim.c

+ 47
- 28
src/libserver/dkim.c View 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;

Loading…
Cancel
Save