X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/bc2767e61d9d31d2fb05078b0214d84d5e68d23d..1ddb1855402d48ad735e46abaf0d662e45600ecd:/src/src/arc.c diff --git a/src/src/arc.c b/src/src/arc.c index 061731280..e0ee19950 100644 --- a/src/src/arc.c +++ b/src/src/arc.c @@ -3,6 +3,7 @@ *************************************************/ /* Experimental ARC support for Exim Copyright (c) Jeremy Harris 2018 - 2020 + Copyright (c) The Exim Maintainers 2021 License: GPL */ @@ -1607,20 +1608,18 @@ expire = now = 0; /* Parse the signing specification */ -identity = string_nextinlist(&signspec, &sep, NULL, 0); -selector = string_nextinlist(&signspec, &sep, NULL, 0); -if ( !*identity || !*selector - || !(privkey = string_nextinlist(&signspec, &sep, NULL, 0)) || !*privkey) - { - s = !*identity ? US"identity" : !*selector ? US"selector" : US"private-key"; - goto bad_arg_ret; - } +if (!(identity = string_nextinlist(&signspec, &sep, NULL, 0)) || !*identity) + { s = US"identity"; goto bad_arg_ret; } +if (!(selector = string_nextinlist(&signspec, &sep, NULL, 0)) || !*selector) + { s = US"selector"; goto bad_arg_ret; } +if (!(privkey = string_nextinlist(&signspec, &sep, NULL, 0)) || !*privkey) + { s = US"privkey"; goto bad_arg_ret; } if (!arc_valid_id(identity)) { s = US"identity"; goto bad_arg_ret; } if (!arc_valid_id(selector)) { s = US"selector"; goto bad_arg_ret; } if (*privkey == '/' && !(privkey = expand_file_big_buffer(privkey))) - return sigheaders ? sigheaders : string_get(0); + goto ret_sigheaders; if ((opts = string_nextinlist(&signspec, &sep, NULL, 0))) { @@ -1679,7 +1678,7 @@ if ((rheaders = arc_sign_scan_headers(&arc_sign_ctx, sigheaders))) if (!(arc_sign_find_ar(headers, identity, &ar))) { log_write(0, LOG_MAIN, "ARC: no Authentication-Results header for signing"); - return sigheaders ? sigheaders : string_get(0); + goto ret_sigheaders; } /* We previously built the data-struct for the existing ARC chain, if any, using a headers @@ -1735,14 +1734,19 @@ if (g) /* Finally, append the dkim headers and return the lot. */ if (sigheaders) g = string_catn(g, sigheaders->s, sigheaders->ptr); -(void) string_from_gstring(g); -gstring_release_unused(g); -return g; + +out: + if (!g) return string_get(1); + (void) string_from_gstring(g); + gstring_release_unused(g); + return g; bad_arg_ret: log_write(0, LOG_MAIN, "ARC: bad signing-specification (%s)", s); - return sigheaders ? sigheaders : string_get(0); +ret_sigheaders: + g = sigheaders; + goto out; }