If an engine comes up explicitely, it must also come down explicitely
In apps/apps.c, one can set up an engine with setup_engine().
However, we freed the structural reference immediately, which means
that for engines that don't already have a structural reference
somewhere else (because it's a built in engine), we end up returning
an invalid reference.
Instead, the function release_engine() is added, and called at the end
of the routines that call setup_engine().
Reviewed-by: Rich Salz <rsalz@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/1643)
diff --git a/apps/dsaparam.c b/apps/dsaparam.c
index 027597b..2522f1f 100644
--- a/apps/dsaparam.c
+++ b/apps/dsaparam.c
@@ -66,6 +66,7 @@
int dsaparam_main(int argc, char **argv)
{
+ ENGINE *e = NULL;
DSA *dsa = NULL;
BIO *in = NULL, *out = NULL;
BN_GENCB *cb = NULL;
@@ -105,7 +106,7 @@
outfile = opt_arg();
break;
case OPT_ENGINE:
- (void)setup_engine(opt_arg(), 0);
+ e = setup_engine(opt_arg(), 0);
break;
case OPT_TIMEBOMB:
# ifdef GENCB_TEST
@@ -285,6 +286,7 @@
BIO_free(in);
BIO_free_all(out);
DSA_free(dsa);
+ release_engine(e);
return (ret);
}