From: Phil Pennock Date: Mon, 21 Feb 2011 06:09:25 +0000 (-0500) Subject: DKIM multiple signature generation fix. X-Git-Tag: exim-4_75_RC1~2 X-Git-Url: https://git.exim.org/exim.git/commitdiff_plain/bc4bc4c581f45f7afae0e06e5279026dae7e519a?ds=sidebyside DKIM multiple signature generation fix. Patch from Uwe Doering, sign-off by Michael Haardt. fixes bug 1019 --- diff --git a/doc/doc-txt/ChangeLog b/doc/doc-txt/ChangeLog index 3764a88a1..1188810ba 100644 --- a/doc/doc-txt/ChangeLog +++ b/doc/doc-txt/ChangeLog @@ -69,6 +69,9 @@ PP/12 Bugzilla 1056: Improved spamd server selection. PP/13 Bugzilla 1086: Deal with maildir quota file races. Based on patch from Heiko Schlittermann. +PP/14 Bugzilla 1019: DKIM multiple signature generation fix. + Patch from Uwe Doering, sign-off by Michael Haardt. + Exim version 4.74 ----------------- diff --git a/src/src/dkim.c b/src/src/dkim.c index 2a06dee92..e25ff8c85 100644 --- a/src/src/dkim.c +++ b/src/src/dkim.c @@ -397,6 +397,9 @@ uschar *dkim_exim_sign(int dkim_fd, uschar *dkim_private_key_expanded; pdkim_ctx *ctx = NULL; uschar *rc = NULL; + uschar *sigbuf = NULL; + int sigsize = 0; + int sigptr = 0; pdkim_signature *signature; int pdkim_canon; int pdkim_rc; @@ -405,6 +408,8 @@ uschar *dkim_exim_sign(int dkim_fd, int save_errno = 0; int old_pool = store_pool; + store_pool = POOL_MAIN; + dkim_domain = expand_string(dkim_domain); if (dkim_domain == NULL) { /* expansion error, do not send message. */ @@ -484,8 +489,7 @@ uschar *dkim_exim_sign(int dkim_fd, (Ustrcmp(dkim_private_key_expanded,"0") == 0) || (Ustrcmp(dkim_private_key_expanded,"false") == 0) ) { /* don't sign, but no error */ - rc = US""; - goto CLEANUP; + continue; } if (dkim_private_key_expanded[0] == '/') { @@ -522,6 +526,7 @@ uschar *dkim_exim_sign(int dkim_fd, 0, 0); + lseek(dkim_fd, 0, SEEK_SET); while((sread = read(dkim_fd,&buf,4096)) > 0) { if (pdkim_feed(ctx,buf,sread) != PDKIM_OK) { rc = NULL; @@ -539,17 +544,24 @@ uschar *dkim_exim_sign(int dkim_fd, pdkim_rc = pdkim_feed_finish(ctx,&signature); if (pdkim_rc != PDKIM_OK) { log_write(0, LOG_MAIN|LOG_PANIC, "DKIM: signing failed (RC %d)", pdkim_rc); + rc = NULL; goto CLEANUP; } - rc = store_get(strlen(signature->signature_header)+3); - Ustrcpy(rc,US signature->signature_header); - Ustrcat(rc,US"\r\n"); + sigbuf = string_append(sigbuf, &sigsize, &sigptr, 2, + US signature->signature_header, + US"\r\n"); pdkim_free_ctx(ctx); ctx = NULL; } + if (sigbuf != NULL) { + sigbuf[sigptr] = '\0'; + rc = sigbuf; + } else + rc = US""; + CLEANUP: if (ctx != NULL) pdkim_free_ctx(ctx);