Automatically free up dynamically allocated public key methods when
and ENGINE is destroyed.
This commit is contained in:
parent
1892c8bf97
commit
7e5b06813d
5 changed files with 32 additions and 2 deletions
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue