X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=src%2Fsrc%2Fdkim.c;h=5c9d2279e165767715385013862a330b81023c9d;hb=5031095fd4553935c70e1c24a9936dfc609cdc67;hp=96d7eba81468ce89b3fee2c2413ff4c780cb5fb4;hpb=fe12ec888ef7b81ee0f5874ca6201ba11b0e9b19;p=exim.git diff --git a/src/src/dkim.c b/src/src/dkim.c index 96d7eba81..5c9d2279e 100644 --- a/src/src/dkim.c +++ b/src/src/dkim.c @@ -37,25 +37,28 @@ static const uschar * dkim_collect_error = NULL; -/*XXX the caller only uses the first record if we return multiple. +/* Look up the DKIM record in DNS for the given hostname. +Will use the first found if there are multiple. +The return string is tainted, having come from off-site. */ uschar * -dkim_exim_query_dns_txt(uschar * name) +dkim_exim_query_dns_txt(const uschar * name) { -dns_answer dnsa; +dns_answer * dnsa = store_get_dns_answer(); dns_scan dnss; +rmark reset_point = store_mark(); gstring * g = NULL; lookup_dnssec_authenticated = NULL; -if (dns_lookup(&dnsa, name, T_TXT, NULL) != DNS_SUCCEED) +if (dns_lookup(dnsa, name, T_TXT, NULL) != DNS_SUCCEED) return NULL; /*XXX better error detail? logging? */ /* Search for TXT record */ -for (dns_record * rr = dns_next_rr(&dnsa, &dnss, RESET_ANSWERS); +for (dns_record * rr = dns_next_rr(dnsa, &dnss, RESET_ANSWERS); rr; - rr = dns_next_rr(&dnsa, &dnss, RESET_NEXT)) + rr = dns_next_rr(dnsa, &dnss, RESET_NEXT)) if (rr->type == T_TXT) { int rr_offset = 0; @@ -76,7 +79,7 @@ for (dns_record * rr = dns_next_rr(&dnsa, &dnss, RESET_ANSWERS); /* check if this looks like a DKIM record */ if (Ustrncmp(g->s, "v=", 2) != 0 || strncasecmp(CS g->s, "v=dkim", 6) == 0) { - gstring_reset_unused(g); + gstring_release_unused(g); return string_from_gstring(g); } @@ -84,7 +87,7 @@ for (dns_record * rr = dns_next_rr(&dnsa, &dnss, RESET_ANSWERS); } bad: -if (g) store_reset(g); +store_reset(reset_point); return NULL; /*XXX better error detail? logging? */ } @@ -92,6 +95,8 @@ return NULL; /*XXX better error detail? logging? */ void dkim_exim_init(void) { +if (f.dkim_init_done) return; +f.dkim_init_done = TRUE; pdkim_init(); } @@ -100,6 +105,8 @@ pdkim_init(); void dkim_exim_verify_init(BOOL dot_stuffing) { +dkim_exim_init(); + /* There is a store-reset between header & body reception so cannot use the main pool. Any allocs done by Exim memory-handling must use the perm pool. */ @@ -566,6 +573,8 @@ void dkim_exim_sign_init(void) { int old_pool = store_pool; + +dkim_exim_init(); store_pool = POOL_MAIN; pdkim_init_context(&dkim_sign_ctx, FALSE, &dkim_exim_query_dns_txt); store_pool = old_pool; @@ -780,14 +789,15 @@ CLEANUP: pk_bad: log_write(0, LOG_MAIN|LOG_PANIC, - "DKIM: signing failed: %.100s", pdkim_errstr(pdkim_rc)); + "DKIM: signing failed: %.100s", pdkim_errstr(pdkim_rc)); bad: sigbuf = NULL; goto CLEANUP; expand_bad: - log_write(0, LOG_MAIN | LOG_PANIC, "failed to expand %s: %s", - errwhen, expand_string_message); + *errstr = string_sprintf("failed to expand %s: %s", + errwhen, expand_string_message); + log_write(0, LOG_MAIN | LOG_PANIC, "%s", *errstr); goto bad; }