summaryrefslogtreecommitdiffstats
path: root/crypto/evp/digest.c
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/evp/digest.c')
-rw-r--r--crypto/evp/digest.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/crypto/evp/digest.c b/crypto/evp/digest.c
index f1c905ab75..5c5b118486 100644
--- a/crypto/evp/digest.c
+++ b/crypto/evp/digest.c
@@ -75,13 +75,22 @@ EVP_MD_CTX *EVP_MD_CTX_create(void)
return ctx;
}
+#ifdef CRYPTO_MDEBUG
+int EVP_DigestInit_dbg(EVP_MD_CTX *ctx, const EVP_MD *type,const char *file,
+ int line)
+#else
int EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type)
+#endif
{
if(ctx->digest != type)
{
OPENSSL_free(ctx->md_data);
ctx->digest=type;
+#ifdef CRYPTO_MDEBUG
+ ctx->md_data=CRYPTO_malloc(type->ctx_size,file,line);
+#else
ctx->md_data=OPENSSL_malloc(type->ctx_size);
+#endif
}
return type->init(ctx->md_data);
}
@@ -142,7 +151,12 @@ void EVP_MD_CTX_destroy(EVP_MD_CTX *ctx)
/* This call frees resources associated with the context */
int EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx)
{
- /* assume ctx->md_data was cleaned in EVP_Digest_Final */
+ /* Don't assume ctx->md_data was cleaned in EVP_Digest_Final,
+ * because sometimes only copies of the context are ever finalised.
+ */
+ if(ctx->md_data)
+ memset(ctx->md_data,0,ctx->digest->ctx_size);
+
OPENSSL_free(ctx->md_data);
memset(ctx,'\0',sizeof *ctx);