commit 2c88ced1adfb34a5ba4231b0a4f890234c9f3991 from: Martijn van Duren date: Sun May 16 19:59:57 2021 UTC Fix a couple of hangs on error paths. commit - 02ba25e35f334db5515fa4c115f106d5116fdf0c commit + 2c88ced1adfb34a5ba4231b0a4f890234c9f3991 blob - 13e61d3659c3073073f0e2ff9aaef932b5feadcf blob + 7f577bbab83315027f318f2574d1e6d74f1444a9 --- main.c +++ main.c @@ -568,24 +568,24 @@ dkim_sign(struct osmtpd_ctx *ctx) now = time(NULL); if (addtime && !dkim_signature_printf(message, "t=%lld; ", (long long)now)) - return; + goto fail; if (addexpire != 0 && !dkim_signature_printf(message, "x=%lld; ", now + addexpire < now ? INT64_MAX : now + addexpire)) - return; + goto fail; if (canonbody == CANON_SIMPLE && !message->has_body) { if (EVP_DigestUpdate(message->dctx, "\r\n", 2) <= 0) { dkim_errx(message, "Can't update hash context"); - return; + goto fail; } } if (EVP_DigestFinal_ex(message->dctx, bdigest, &digestsz) == 0) { dkim_errx(message, "Can't finalize hash context"); - return; + goto fail; } EVP_EncodeBlock(digest, bdigest, digestsz); if (!dkim_signature_printf(message, "bh=%s; h=", digest)) - return; + goto fail; /* Reverse order for ease of use of RFC6367 section 5.4.2 */ for (i = 0; message->headers[i] != NULL; i++) continue; @@ -595,12 +595,12 @@ dkim_sign(struct osmtpd_ctx *ctx) pkey) != 1) { dkim_errx(message, "Failed to initialize signature " "context"); - return; + goto fail; } } else { if (EVP_DigestInit_ex(message->dctx, hash_md, NULL) != 1) { dkim_errx(message, "Failed to initialize hash context"); - return; + goto fail; } } for (i--; i >= 0; i--) { @@ -612,7 +612,7 @@ dkim_sign(struct osmtpd_ctx *ctx) 2) <= 0) { dkim_errx(message, "Failed to update signature " "context"); - return; + goto fail; } } else { if (EVP_DigestUpdate(message->dctx, message->headers[i], @@ -620,7 +620,7 @@ dkim_sign(struct osmtpd_ctx *ctx) EVP_DigestUpdate(message->dctx, "\r\n", 2) <= 0) { dkim_errx(message, "Failed to update digest " "context"); - return; + goto fail; } } if ((tsdomain = dkim_domain_select(message, message->headers[i])) != NULL) @@ -635,14 +635,14 @@ dkim_sign(struct osmtpd_ctx *ctx) if (!dkim_signature_printf(message, "%s%s", message->headers[i + 1] == NULL ? "" : ":", message->headers[i])) - return; + goto fail; } dkim_signature_printf(message, "; d=%s; b=", sdomain); if (!dkim_signature_normalize(message)) - return; + goto fail; if ((tmp = strdup(message->signature.signature)) == NULL) { dkim_err(message, "Can't create DKIM signature"); - return; + goto fail; } dkim_parse_header(message, tmp, 1); if (!sephash) { @@ -650,62 +650,62 @@ dkim_sign(struct osmtpd_ctx *ctx) strlen(tmp)) != 1) { dkim_errx(message, "Failed to update signature " "context"); - return; + goto fail; } } else { if (EVP_DigestUpdate(message->dctx, tmp, strlen(tmp)) != 1) { dkim_errx(message, "Failed to update digest context"); - return; + goto fail; } } free(tmp); if (!sephash) { if (EVP_DigestSignFinal(message->dctx, NULL, &linelen) != 1) { dkim_errx(message, "Can't finalize signature context"); - return; + goto fail; } #ifdef HAVE_ED25519 } else { if (EVP_DigestFinal_ex(message->dctx, bdigest, &digestsz) != 1) { dkim_errx(message, "Can't finalize hash context"); - return; + goto fail; } EVP_MD_CTX_reset(message->dctx); if (EVP_DigestSignInit(message->dctx, NULL, NULL, NULL, pkey) != 1) { dkim_errx(message, "Failed to initialize signature " "context"); - return; + goto fail; } if (EVP_DigestSign(message->dctx, NULL, &linelen, bdigest, digestsz) != 1) { dkim_errx(message, "Failed to finalize signature"); - return; + goto fail; } #endif } if ((tmp = malloc(linelen)) == NULL) { dkim_err(message, "Can't allocate space for signature"); - return; + goto fail; } if (!sephash) { if (EVP_DigestSignFinal(message->dctx, tmp, &linelen) != 1) { dkim_errx(message, "Failed to finalize signature"); - return; + goto fail; } #ifdef HAVE_ED25519 } else { if (EVP_DigestSign(message->dctx, tmp, &linelen, bdigest, digestsz) != 1) { dkim_errx(message, "Failed to finalize signature"); - return; + goto fail; } #endif } if ((b = malloc((((linelen + 2) / 3) * 4) + 1)) == NULL) { dkim_err(message, "Can't create DKIM signature"); - return; + goto fail; } EVP_EncodeBlock(b, tmp, linelen); free(tmp); @@ -726,6 +726,9 @@ dkim_sign(struct osmtpd_ctx *ctx) osmtpd_filter_dataline(ctx, "%s", tmp); } free(tmp); + return; +fail: + osmtpd_filter_dataline(ctx, "."); } int