Commit 7e5b0681 authored by Dr. Stephen Henson's avatar Dr. Stephen Henson
Browse files

Automatically free up dynamically allocated public key methods when

and ENGINE is destroyed.
parent 1892c8bf
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -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
 * 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
 * algorithms and functions. */
struct engine_st
+2 −0
Original line number Diff line number Diff line
@@ -125,6 +125,8 @@ int engine_free_util(ENGINE *e, int locked)
		abort();
		}
#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
	 * to allocation it did in its constructor (eg. unload error strings) */
	if(e->destroy)
+1 −0
Original line number Diff line number Diff line
@@ -336,6 +336,7 @@ static void engine_cpy(ENGINE *dest, const ENGINE *src)
	dest->store_meth = src->store_meth;
	dest->ciphers = src->ciphers;
	dest->digests = src->digests;
	dest->pkey_meths = src->pkey_meths;
	dest->destroy = src->destroy;
	dest->init = src->init;
	dest->finish = src->finish;
+1 −1
Original line number Diff line number Diff line
@@ -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. */
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_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
 * 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
+24 −1
Original line number Diff line number Diff line
@@ -118,7 +118,7 @@ ENGINE *ENGINE_get_pkey_meth_engine(int nid)
/* 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 *ret;
	EVP_PKEY_METHOD *ret;
	ENGINE_PKEY_METHS_PTR fn = ENGINE_get_pkey_meths(e);
	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;
	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);
				}
			}
		}
	}