aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@rambler-co.ru>2012-05-31 21:41:55 +0400
committerVsevolod Stakhov <vsevolod@rambler-co.ru>2012-05-31 21:41:55 +0400
commit21f28110c551ccb23e6706add70f62a9d166e54e (patch)
tree9f26da88d8e56e827fdb0264f10ba0fa9078f6b9
parent83ea316af2bb37e25a88011b3fe794e2a10214a9 (diff)
downloadrspamd-21f28110c551ccb23e6706add70f62a9d166e54e.tar.gz
rspamd-21f28110c551ccb23e6706add70f62a9d166e54e.zip
Fix WSP canonization.
-rw-r--r--src/dkim.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/src/dkim.c b/src/dkim.c
index c74222d3e..a46596d6f 100644
--- a/src/dkim.c
+++ b/src/dkim.c
@@ -765,7 +765,12 @@ rspamd_dkim_relaxed_body_step (GChecksum *ck, const gchar **start, guint remain)
continue;
}
else {
+ *t++ = ' ';
+ h ++;
+ inlen --;
+ len --;
got_sp = TRUE;
+ continue;
}
}
else {
@@ -778,6 +783,9 @@ rspamd_dkim_relaxed_body_step (GChecksum *ck, const gchar **start, guint remain)
*start = h;
+ /* Maybe extremely slow
+ * msg_debug ("update signature with buffer: %*s", t - buf, buf);
+ */
g_checksum_update (ck, buf, t - buf);
return !finished;
@@ -862,7 +870,8 @@ rspamd_dkim_signature_update (rspamd_dkim_context_t *ctx, const gchar *begin, gu
while ((*p == '\r' || *p == '\n') && p >= c) {
p --;
}
- if (p - c > 0) {
+
+ if (p - c + 1 > 0) {
msg_debug ("final update hash with signature part: %*s", p - c + 1, c);
g_checksum_update (ctx->headers_hash, c, p - c + 1);
}
@@ -872,7 +881,7 @@ static gboolean
rspamd_dkim_canonize_header_relaxed (rspamd_dkim_context_t *ctx, const gchar *header, const gchar *header_name, gboolean is_sign)
{
const gchar *h;
- gchar *t, *buf, *v;
+ gchar *t, *buf;
guint inlen;
gboolean got_sp, allocated = FALSE;
@@ -895,7 +904,6 @@ rspamd_dkim_canonize_header_relaxed (rspamd_dkim_context_t *ctx, const gchar *he
*t++ = ':';
/* Value part */
- v = t;
h = header;
got_sp = FALSE;
@@ -907,6 +915,9 @@ rspamd_dkim_canonize_header_relaxed (rspamd_dkim_context_t *ctx, const gchar *he
}
else {
got_sp = TRUE;
+ *t ++ = ' ';
+ h ++;
+ continue;
}
}
else {
@@ -1017,7 +1028,12 @@ rspamd_dkim_canonize_header (rspamd_dkim_context_t *ctx, struct worker_task *tas
if (! rspamd_dkim_canonize_header_relaxed (ctx, rh->value, header_name, is_sig)) {
return FALSE;
}
- rh = rh->next;
+ if (!is_sig) {
+ rh = rh->next;
+ }
+ else {
+ rh = NULL;
+ }
}
return TRUE;
}