diff --git a/fips/rand/fips_drbg_lib.c b/fips/rand/fips_drbg_lib.c index 94bc36a31..a015da1e4 100644 --- a/fips/rand/fips_drbg_lib.c +++ b/fips/rand/fips_drbg_lib.c @@ -112,7 +112,8 @@ DRBG_CTX *FIPS_drbg_new(int type, unsigned int flags) void FIPS_drbg_free(DRBG_CTX *dctx) { - dctx->uninstantiate(dctx); + if (dctx->uninstantiate) + dctx->uninstantiate(dctx); OPENSSL_cleanse(dctx, sizeof(DRBG_CTX)); OPENSSL_free(dctx); } @@ -388,8 +389,9 @@ int FIPS_drbg_uninstantiate(DRBG_CTX *dctx) { int rv; if (!dctx->uninstantiate) - return 1; - rv = dctx->uninstantiate(dctx); + rv = 1; + else + rv = dctx->uninstantiate(dctx); /* Although we'd like to cleanse here we can't because we have to * test the uninstantiate really zeroes the data. */ diff --git a/fips/rand/fips_drbg_selftest.c b/fips/rand/fips_drbg_selftest.c index f580eafb4..af21971ba 100644 --- a/fips/rand/fips_drbg_selftest.c +++ b/fips/rand/fips_drbg_selftest.c @@ -1011,6 +1011,7 @@ int FIPS_selftest_drbg(void) if (!fips_drbg_health_check(dctx, td)) break; } + FIPS_drbg_free(dctx); if (td->nid == 0) return 1; return 0;