Automatically free up dynamically allocated public key methods when

and ENGINE is destroyed.
This commit is contained in:
Dr. Stephen Henson 2006-06-02 17:09:17 +00:00
parent 1892c8bf97
commit 7e5b06813d
5 changed files with 32 additions and 2 deletions

View file

@ -143,6 +143,10 @@ void engine_set_all_null(ENGINE *e);
/* NB: Bitwise OR-able values for the "flags" variable in ENGINE are now exposed /* NB: Bitwise OR-able values for the "flags" variable in ENGINE are now exposed
* in engine.h. */ * in engine.h. */
/* Free up dynamically allocated public key methods associated with ENGINE */
void engine_pkey_meths_free(ENGINE *e);
/* This is a structure for storing implementations of various crypto /* This is a structure for storing implementations of various crypto
* algorithms and functions. */ * algorithms and functions. */
struct engine_st struct engine_st

View file

@ -125,6 +125,8 @@ int engine_free_util(ENGINE *e, int locked)
abort(); abort();
} }
#endif #endif
/* Free up any dynamically allocated public key methods */
engine_pkey_meths_free(e);
/* Give the ENGINE a chance to do any structural cleanup corresponding /* Give the ENGINE a chance to do any structural cleanup corresponding
* to allocation it did in its constructor (eg. unload error strings) */ * to allocation it did in its constructor (eg. unload error strings) */
if(e->destroy) if(e->destroy)

View file

@ -336,6 +336,7 @@ static void engine_cpy(ENGINE *dest, const ENGINE *src)
dest->store_meth = src->store_meth; dest->store_meth = src->store_meth;
dest->ciphers = src->ciphers; dest->ciphers = src->ciphers;
dest->digests = src->digests; dest->digests = src->digests;
dest->pkey_meths = src->pkey_meths;
dest->destroy = src->destroy; dest->destroy = src->destroy;
dest->init = src->init; dest->init = src->init;
dest->finish = src->finish; dest->finish = src->finish;

View file

@ -293,7 +293,7 @@ typedef EVP_PKEY * (*ENGINE_LOAD_KEY_PTR)(ENGINE *, const char *,
* parameter is non-NULL it is set to the size of the returned array. */ * parameter is non-NULL it is set to the size of the returned array. */
typedef int (*ENGINE_CIPHERS_PTR)(ENGINE *, const EVP_CIPHER **, const int **, int); typedef int (*ENGINE_CIPHERS_PTR)(ENGINE *, const EVP_CIPHER **, const int **, int);
typedef int (*ENGINE_DIGESTS_PTR)(ENGINE *, const EVP_MD **, const int **, int); typedef int (*ENGINE_DIGESTS_PTR)(ENGINE *, const EVP_MD **, const int **, int);
typedef int (*ENGINE_PKEY_METHS_PTR)(ENGINE *, const EVP_PKEY_METHOD **, const int **, int); typedef int (*ENGINE_PKEY_METHS_PTR)(ENGINE *, EVP_PKEY_METHOD **, const int **, int);
/* STRUCTURE functions ... all of these functions deal with pointers to ENGINE /* STRUCTURE functions ... all of these functions deal with pointers to ENGINE
* structures where the pointers have a "structural reference". This means that * structures where the pointers have a "structural reference". This means that
* their reference is to allowed access to the structure but it does not imply * their reference is to allowed access to the structure but it does not imply

View file

@ -118,7 +118,7 @@ ENGINE *ENGINE_get_pkey_meth_engine(int nid)
/* Obtains a pkey_meth implementation from an ENGINE functional reference */ /* Obtains a pkey_meth implementation from an ENGINE functional reference */
const EVP_PKEY_METHOD *ENGINE_get_pkey_meth(ENGINE *e, int nid) const EVP_PKEY_METHOD *ENGINE_get_pkey_meth(ENGINE *e, int nid)
{ {
const EVP_PKEY_METHOD *ret; EVP_PKEY_METHOD *ret;
ENGINE_PKEY_METHS_PTR fn = ENGINE_get_pkey_meths(e); ENGINE_PKEY_METHS_PTR fn = ENGINE_get_pkey_meths(e);
if(!fn || !fn(e, &ret, NULL, nid)) if(!fn || !fn(e, &ret, NULL, nid))
{ {
@ -141,3 +141,26 @@ int ENGINE_set_pkey_meths(ENGINE *e, ENGINE_PKEY_METHS_PTR f)
e->pkey_meths = f; e->pkey_meths = f;
return 1; return 1;
} }
/* Internal function to free up EVP_PKEY_METHOD structures before an
* ENGINE is destroyed
*/
void engine_pkey_meths_free(ENGINE *e)
{
int i;
EVP_PKEY_METHOD *pkm;
if (e->pkey_meths)
{
const int *pknids;
int npknids;
npknids = e->pkey_meths(e, NULL, &pknids, 0);
for (i = 0; i < npknids; i++)
{
if (e->pkey_meths(e, &pkm, NULL, pknids[i]))
{
EVP_PKEY_meth_free(pkm);
}
}
}
}