diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2020-03-03 13:19:22 +0000 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2020-03-03 13:19:22 +0000 |
commit | 29929c32eeb0e17b5813459c76f6521105c1929e (patch) | |
tree | 303d121acde2a4c4ec9971dc7f76d8ce909d8821 /src/libserver/dkim.c | |
parent | b82366d9eff3791c986c5d04d107d0fb38a65c3c (diff) | |
download | rspamd-29929c32eeb0e17b5813459c76f6521105c1929e.tar.gz rspamd-29929c32eeb0e17b5813459c76f6521105c1929e.zip |
[Minor] Fix some corner case with l tag in DKIM
Diffstat (limited to 'src/libserver/dkim.c')
-rw-r--r-- | src/libserver/dkim.c | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/src/libserver/dkim.c b/src/libserver/dkim.c index 1bd7ec3d6..8b1ac24ab 100644 --- a/src/libserver/dkim.c +++ b/src/libserver/dkim.c @@ -1914,6 +1914,7 @@ rspamd_dkim_canonize_body (struct rspamd_dkim_common_ctx *ctx, { const gchar *p; guint remain = ctx->len ? ctx->len : (guint)(end - start); + guint total_len = end - start; gboolean need_crlf = FALSE; if (start == NULL) { @@ -1948,10 +1949,32 @@ rspamd_dkim_canonize_body (struct rspamd_dkim_common_ctx *ctx, while (rspamd_dkim_simple_body_step (ctx, ctx->body_hash, &start, end - start, &remain)); + /* + * If we have l= tag then we cannot add crlf... + */ if (need_crlf) { + /* l is evil... */ + if (ctx->len == 0) { + remain = 2; + } + else { + if (ctx->len <= total_len) { + /* We don't have enough l to add \r\n */ + remain = 0; + } + else { + if (ctx->len - total_len >= 2) { + remain = 2; + } + else { + remain = ctx->len - total_len; + } + } + } + start = "\r\n"; end = start + 2; - remain = 2; + rspamd_dkim_simple_body_step (ctx, ctx->body_hash, &start, end - start, &remain); } |