Skip to content

Commit

Permalink
Avoid segfaults in EVP_PKEY_CTX_free()
Browse files Browse the repository at this point in the history
It is possible to call pmeth->cleanup() with an EVP_PKEY_CTX whose data
is NULL. If pmeth->init() in int_ctx_new() fails, EVP_PKEY_CTX_free() is
called with such a context. This in turn calls pmeth->cleanup(), and thus
these cleanup functions must be careful not to use NULL data.  Most of
them are, but one of GOST's functions and HMAC's aren't.

Reported for HMAC by Masaru Masada
#129

ok bcook jsing
  • Loading branch information
tb committed Mar 30, 2022
1 parent a7b96f3 commit 0b62cfa
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 4 deletions.
7 changes: 5 additions & 2 deletions src/lib/libcrypto/gost/gostr341001_pmeth.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* $OpenBSD: gostr341001_pmeth.c,v 1.15 2022/01/07 09:40:03 tb Exp $ */
/* $OpenBSD: gostr341001_pmeth.c,v 1.16 2022/03/30 07:17:48 tb Exp $ */
/*
* Copyright (c) 2014 Dmitry Eremin-Solenikov <[email protected]>
* Copyright (c) 2005-2006 Cryptocom LTD
Expand Down Expand Up @@ -175,7 +175,10 @@ pkey_gost01_copy(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src)
static void
pkey_gost01_cleanup(EVP_PKEY_CTX *ctx)
{
struct gost_pmeth_data *data = EVP_PKEY_CTX_get_data(ctx);
struct gost_pmeth_data *data;

if ((data = EVP_PKEY_CTX_get_data(ctx)) == NULL)
return;

free(data->shared_ukm);
free(data);
Expand Down
7 changes: 5 additions & 2 deletions src/lib/libcrypto/hmac/hm_pmeth.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* $OpenBSD: hm_pmeth.c,v 1.12 2022/03/30 07:12:30 tb Exp $ */
/* $OpenBSD: hm_pmeth.c,v 1.13 2022/03/30 07:17:48 tb Exp $ */
/* Written by Dr Stephen N Henson ([email protected]) for the OpenSSL
* project 2007.
*/
Expand Down Expand Up @@ -116,7 +116,10 @@ pkey_hmac_copy(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src)
static void
pkey_hmac_cleanup(EVP_PKEY_CTX *ctx)
{
HMAC_PKEY_CTX *hctx = ctx->data;
HMAC_PKEY_CTX *hctx;

if ((hctx = ctx->data) == NULL)
return;

HMAC_CTX_cleanup(&hctx->ctx);
freezero(hctx->ktmp.data, hctx->ktmp.length);
Expand Down

0 comments on commit 0b62cfa

Please sign in to comment.