From 29929c32eeb0e17b5813459c76f6521105c1929e Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Tue, 3 Mar 2020 13:19:22 +0000 Subject: [PATCH] [Minor] Fix some corner case with l tag in DKIM --- src/libserver/dkim.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/libserver/dkim.c b/src/libserver/dkim.c index 1bd7ec3d68..8b1ac24aba 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); } -- 2.47.3