From 14bec2c4b4a74f7de3bdf4b3fff764d8842c27ab Mon Sep 17 00:00:00 2001 From: Matt Caswell Date: Thu, 26 Sep 2019 14:55:00 +0100 Subject: [PATCH] Free a fetched digest during EVP_MD_CTX_reset() not EVP_MD_free() Otherwise a mem leak can occur since EVP_MD_free() calls EVP_MD_CTX_reset() which then clears the contents of the ctx. Reviewed-by: Paul Dale (Merged from https://github.com/openssl/openssl/pull/10013) --- crypto/evp/digest.c | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/crypto/evp/digest.c b/crypto/evp/digest.c index 6609e8f541..874b16b6ee 100644 --- a/crypto/evp/digest.c +++ b/crypto/evp/digest.c @@ -34,8 +34,9 @@ int EVP_MD_CTX_reset(EVP_MD_CTX *ctx) EVP_PKEY_CTX_free(ctx->pctx); #endif - if (ctx->digest == NULL || ctx->digest->prov == NULL) - goto legacy; + EVP_MD_free(ctx->fetched_digest); + ctx->fetched_digest = NULL; + ctx->reqdigest = NULL; if (ctx->provctx != NULL) { if (ctx->digest->freectx != NULL) @@ -44,13 +45,7 @@ int EVP_MD_CTX_reset(EVP_MD_CTX *ctx) EVP_MD_CTX_set_flags(ctx, EVP_MD_CTX_FLAG_CLEANED); } - if (ctx->pctx != NULL) - goto legacy; - - return 1; - /* TODO(3.0): Remove legacy code below */ - legacy: /* * Don't assume ctx->md_data was cleaned in EVP_Digest_Final, because @@ -67,6 +62,9 @@ int EVP_MD_CTX_reset(EVP_MD_CTX *ctx) #if !defined(FIPS_MODE) && !defined(OPENSSL_NO_ENGINE) ENGINE_finish(ctx->engine); #endif + + /* TODO(3.0): End of legacy code */ + OPENSSL_cleanse(ctx, sizeof(*ctx)); return 1; @@ -84,11 +82,6 @@ void EVP_MD_CTX_free(EVP_MD_CTX *ctx) EVP_MD_CTX_reset(ctx); - EVP_MD_free(ctx->fetched_digest); - ctx->fetched_digest = NULL; - ctx->digest = NULL; - ctx->reqdigest = NULL; - OPENSSL_free(ctx); return; } -- 2.34.1