diff options
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libcrypto/evp/digest.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/src/lib/libcrypto/evp/digest.c b/src/lib/libcrypto/evp/digest.c index d582d7954e..a1be18ee22 100644 --- a/src/lib/libcrypto/evp/digest.c +++ b/src/lib/libcrypto/evp/digest.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: digest.c,v 1.22 2014/07/12 16:03:37 miod Exp $ */ | 1 | /* $OpenBSD: digest.c,v 1.23 2014/07/13 11:14:02 miod Exp $ */ |
| 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
| 3 | * All rights reserved. | 3 | * All rights reserved. |
| 4 | * | 4 | * |
| @@ -192,13 +192,19 @@ EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl) | |||
| 192 | } | 192 | } |
| 193 | #endif | 193 | #endif |
| 194 | if (ctx->digest != type) { | 194 | if (ctx->digest != type) { |
| 195 | if (ctx->digest && ctx->digest->ctx_size) | 195 | if (ctx->digest && ctx->digest->ctx_size && ctx->md_data && |
| 196 | !EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_REUSE)) { | ||
| 197 | explicit_bzero(ctx->md_data, ctx->digest->ctx_size); | ||
| 196 | free(ctx->md_data); | 198 | free(ctx->md_data); |
| 199 | ctx->md_data = NULL; | ||
| 200 | } | ||
| 197 | ctx->digest = type; | 201 | ctx->digest = type; |
| 198 | if (!(ctx->flags & EVP_MD_CTX_FLAG_NO_INIT) && type->ctx_size) { | 202 | if (!(ctx->flags & EVP_MD_CTX_FLAG_NO_INIT) && type->ctx_size) { |
| 199 | ctx->update = type->update; | 203 | ctx->update = type->update; |
| 200 | ctx->md_data = malloc(type->ctx_size); | 204 | ctx->md_data = malloc(type->ctx_size); |
| 201 | if (ctx->md_data == NULL) { | 205 | if (ctx->md_data == NULL) { |
| 206 | EVP_PKEY_CTX_free(ctx->pctx); | ||
| 207 | ctx->pctx = NULL; | ||
| 202 | EVPerr(EVP_F_EVP_DIGESTINIT_EX, | 208 | EVPerr(EVP_F_EVP_DIGESTINIT_EX, |
| 203 | ERR_R_MALLOC_FAILURE); | 209 | ERR_R_MALLOC_FAILURE); |
| 204 | return 0; | 210 | return 0; |
| @@ -355,7 +361,7 @@ EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx) | |||
| 355 | ctx->digest->cleanup(ctx); | 361 | ctx->digest->cleanup(ctx); |
| 356 | if (ctx->digest && ctx->digest->ctx_size && ctx->md_data && | 362 | if (ctx->digest && ctx->digest->ctx_size && ctx->md_data && |
| 357 | !EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_REUSE)) { | 363 | !EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_REUSE)) { |
| 358 | OPENSSL_cleanse(ctx->md_data, ctx->digest->ctx_size); | 364 | explicit_bzero(ctx->md_data, ctx->digest->ctx_size); |
| 359 | free(ctx->md_data); | 365 | free(ctx->md_data); |
| 360 | } | 366 | } |
| 361 | EVP_PKEY_CTX_free(ctx->pctx); | 367 | EVP_PKEY_CTX_free(ctx->pctx); |
