diff options
author | Dr. Stephen Henson <steve@openssl.org> | 2002-03-09 18:25:03 +0000 |
---|---|---|
committer | Dr. Stephen Henson <steve@openssl.org> | 2002-03-09 18:25:03 +0000 |
commit | 0c372b94f77bebed947b6a5d217a141a3259b3ed (patch) | |
tree | 11484ae0861431320e02ea15ed47b2620b91abd5 /crypto/dsa/dsa_lib.c | |
parent | 26e123738028da5e767cbf7e71c6af114cab6ec3 (diff) |
Make {RSA,DSA,DH}_new_method obtain and release an ENGINE
functional reference in all cases.
Diffstat (limited to 'crypto/dsa/dsa_lib.c')
-rw-r--r-- | crypto/dsa/dsa_lib.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/crypto/dsa/dsa_lib.c b/crypto/dsa/dsa_lib.c index 900e0098fa..da2cdfa3d6 100644 --- a/crypto/dsa/dsa_lib.c +++ b/crypto/dsa/dsa_lib.c @@ -110,19 +110,28 @@ DSA *DSA_new_method(ENGINE *engine) ret=(DSA *)OPENSSL_malloc(sizeof(DSA)); if (ret == NULL) { - DSAerr(DSA_F_DSA_NEW,ERR_R_MALLOC_FAILURE); + DSAerr(DSA_F_DSA_NEW_METHOD,ERR_R_MALLOC_FAILURE); return(NULL); } ret->meth = DSA_get_default_method(); - ret->engine = engine; - if(!ret->engine) + if (engine) + { + if (!ENGINE_init(engine)) + { + DSAerr(DSA_F_DSA_NEW_METHOD, ERR_R_ENGINE_LIB); + OPENSSL_free(ret); + return NULL; + } + ret->engine = engine; + } + else ret->engine = ENGINE_get_default_DSA(); if(ret->engine) { ret->meth = ENGINE_get_DSA(ret->engine); if(!ret->meth) { - DSAerr(DSA_F_DSA_NEW, + DSAerr(DSA_F_DSA_NEW_METHOD, ERR_R_ENGINE_LIB); ENGINE_finish(ret->engine); OPENSSL_free(ret); @@ -149,6 +158,8 @@ DSA *DSA_new_method(ENGINE *engine) CRYPTO_new_ex_data(CRYPTO_EX_INDEX_DSA, ret, &ret->ex_data); if ((ret->meth->init != NULL) && !ret->meth->init(ret)) { + if (ret->engine) + ENGINE_finish(ret->engine); CRYPTO_free_ex_data(CRYPTO_EX_INDEX_DSA, ret, &ret->ex_data); OPENSSL_free(ret); ret=NULL; |