From 6d5667110a6844640af4c7a9cb91b0cffa297ce7 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Sun, 6 Mar 2016 02:54:40 +0100 Subject: [PATCH] Engine API repair - memory management hooks The Engine API lost the setting of memory management hooks in bind_engine. Here's putting that back. EX_DATA and ERR functions need the same treatment. Reviewed-by: Matt Caswell --- crypto/engine/eng_dyn.c | 2 ++ include/openssl/engine.h | 12 ++++++++++++ 2 files changed, 14 insertions(+) diff --git a/crypto/engine/eng_dyn.c b/crypto/engine/eng_dyn.c index 648332a585..30ffa75d26 100644 --- a/crypto/engine/eng_dyn.c +++ b/crypto/engine/eng_dyn.c @@ -510,6 +510,8 @@ static int dynamic_load(ENGINE *e, dynamic_data_ctx *ctx) * would also increase opaqueness. */ fns.static_state = ENGINE_get_static_state(); + CRYPTO_get_mem_functions(fns.mem_fns.malloc_fn, fns.mem_fns.realloc_fn, + fns.mem_fns.free_fn); fns.lock_fns.lock_locking_cb = CRYPTO_get_locking_callback(); fns.lock_fns.lock_add_lock_cb = CRYPTO_get_add_lock_callback(); fns.lock_fns.dynlock_create_cb = CRYPTO_get_dynlock_create_callback(); diff --git a/include/openssl/engine.h b/include/openssl/engine.h index 7b7b2a12f4..253937124b 100644 --- a/include/openssl/engine.h +++ b/include/openssl/engine.h @@ -725,6 +725,14 @@ void ENGINE_add_conf_module(void); * same static data as the calling application (or library), and thus whether * these callbacks need to be set or not. */ +typedef void *(*dyn_MEM_malloc_fn) (size_t, const char *, int); +typedef void *(*dyn_MEM_realloc_fn) (void *, size_t, const char *, int); +typedef void (*dyn_MEM_free_fn) (void *, const char *, int); +typedef struct st_dynamic_MEM_fns { + dyn_MEM_malloc_fn malloc_fn; + dyn_MEM_realloc_fn realloc_fn; + dyn_MEM_free_fn free_fn; +} dynamic_MEM_fns; /* * FIXME: Perhaps the memory and locking code (crypto.h) should declare and * use these types so we (and any other dependant code) can simplify a bit?? @@ -747,6 +755,7 @@ typedef struct st_dynamic_LOCK_fns { /* The top-level structure */ typedef struct st_dynamic_fns { void *static_state; + dynamic_MEM_fns mem_fns; dynamic_LOCK_fns lock_fns; } dynamic_fns; @@ -795,6 +804,9 @@ typedef int (*dynamic_bind_engine) (ENGINE *e, const char *id, OPENSSL_EXPORT \ int bind_engine(ENGINE *e, const char *id, const dynamic_fns *fns) { \ if(ENGINE_get_static_state() == fns->static_state) goto skip_cbs; \ + CRYPTO_set_mem_functions(fns->mem_fns.malloc_fn, \ + fns->mem_fns.realloc_fn, \ + fns->mem_fns.free_fn); \ CRYPTO_set_locking_callback(fns->lock_fns.lock_locking_cb); \ CRYPTO_set_add_lock_callback(fns->lock_fns.lock_add_lock_cb); \ CRYPTO_set_dynlock_create_callback(fns->lock_fns.dynlock_create_cb); \ -- 2.25.1