From 55b7688ef51fc7d150e6178c3d763c37d5b82cb4 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Mon, 19 Jun 2000 16:38:27 +0000 Subject: [PATCH] Add the missing callback pointer handling functions. Also, make sure empty slots of the dynamic lock stack are used. Actually, I'm not really sure this is the right thing to do, and may remove it, with an endlessly growing stack as result... --- crypto/cryptlib.c | 55 ++++++++++++++++++++++++++++++++++++----------- crypto/crypto.h | 15 ++++++------- 2 files changed, 49 insertions(+), 21 deletions(-) diff --git a/crypto/cryptlib.c b/crypto/cryptlib.c index f5e44311f4..cf291b4be5 100644 --- a/crypto/cryptlib.c +++ b/crypto/cryptlib.c @@ -122,7 +122,7 @@ static int (MS_FAR *add_lock_callback)(int *pointer,int amount, static unsigned long (MS_FAR *id_callback)(void)=NULL; static struct CRYPTO_dynlock_value *(MS_FAR *dynlock_create_callback) (const char *file,int line)=NULL; -static void (MS_FAR *dynlock_locking_callback)(int mode, +static void (MS_FAR *dynlock_lock_callback)(int mode, struct CRYPTO_dynlock_value *l, const char *file,int line)=NULL; static void (MS_FAR *dynlock_destroy_callback)(struct CRYPTO_dynlock_value *l, const char *file,int line)=NULL; @@ -199,7 +199,11 @@ int CRYPTO_get_new_dynlockid(void) } CRYPTO_w_lock(CRYPTO_LOCK_DYNLOCK); - i=sk_CRYPTO_dynlock_push(dyn_locks,pointer); + /* First, try to find an existing empty slot */ + i=sk_CRYPTO_dynlock_find(dyn_locks,NULL); + /* If there was none, push, thereby creating a new one */ + if (i == -1) + i=sk_CRYPTO_dynlock_push(dyn_locks,pointer); CRYPTO_w_unlock(CRYPTO_LOCK_DYNLOCK); if (!i) @@ -272,16 +276,47 @@ struct CRYPTO_dynlock_value *CRYPTO_get_dynlock_value(int i) return NULL; } -void (*CRYPTO_get_locking_callback(void))(int mode,int type,const char *file, - int line) +struct CRYPTO_dynlock_value *(*CRYPTO_get_dynlock_create_callback(void)) + (const char *file,int line) { - return(locking_callback); + return(dynlock_create_callback); } void (*CRYPTO_get_dynlock_lock_callback(void))(int mode, struct CRYPTO_dynlock_value *l, const char *file,int line) { - return(dynlock_locking_callback); + return(dynlock_lock_callback); + } + +void (*CRYPTO_get_dynlock_destroy_callback(void)) + (struct CRYPTO_dynlock_value *l, const char *file,int line) + { + return(dynlock_destroy_callback); + } + +void CRYPTO_set_dynlock_create_callback(struct CRYPTO_dynlock_value *(*func) + (const char *file, int line)) + { + dynlock_create_callback=func; + } + +void CRYPTO_set_dynlock_lock_callback(void (*func)(int mode, + struct CRYPTO_dynlock_value *l, const char *file, int line)) + { + dynlock_lock_callback=func; + } + +void CRYPTO_set_dynlock_destroy_callback(void (*func) + (struct CRYPTO_dynlock_value *l, const char *file, int line)) + { + dynlock_destroy_callback=func; + } + + +void (*CRYPTO_get_locking_callback(void))(int mode,int type,const char *file, + int line) + { + return(locking_callback); } int (*CRYPTO_get_add_lock_callback(void))(int *num,int mount,int type, @@ -296,12 +331,6 @@ void CRYPTO_set_locking_callback(void (*func)(int mode,int type, locking_callback=func; } -void CRYPTO_set_dynlock_locking_callback(void (*func)(int mode, - struct CRYPTO_dynlock_value *l, const char *file, int line)) - { - dynlock_locking_callback=func; - } - void CRYPTO_set_add_lock_callback(int (*func)(int *num,int mount,int type, const char *file,int line)) { @@ -372,7 +401,7 @@ void CRYPTO_lock(int mode, int type, const char *file, int line) if (pointer) { - dynlock_locking_callback(mode, pointer, file, line); + dynlock_lock_callback(mode, pointer, file, line); } CRYPTO_destroy_dynlockid(i); diff --git a/crypto/crypto.h b/crypto/crypto.h index 846be386c1..bda2f56df4 100644 --- a/crypto/crypto.h +++ b/crypto/crypto.h @@ -311,17 +311,16 @@ unsigned long CRYPTO_thread_id(void); const char *CRYPTO_get_lock_name(int type); int CRYPTO_add_lock(int *pointer,int amount,int type, const char *file, int line); -void CRYPTO_set_dynlock_create_callback(struct CRYPTO_dynlock_value *(*dyn_create_function) - (char *file, int line)); -void CRYPTO_set_dynlock_lock_callback(void (*dyn_lock_function) - (int mode, struct CRYPTO_dynlock_value *l, - const char *file, int line)); -void CRYPTO_set_dynlock_destroy_callback(void (*dyn_destroy_function) - (struct CRYPTO_dynlock_value *l, const char *file, int line)); -void CRYPTO_set_dynlock_size(int dynlock_size); + int CRYPTO_get_new_dynlockid(void); void CRYPTO_destroy_dynlockid(int i); struct CRYPTO_dynlock_value *CRYPTO_get_dynlock_value(int i); +void CRYPTO_set_dynlock_create_callback(struct CRYPTO_dynlock_value *(*dyn_create_function)(const char *file, int line)); +void CRYPTO_set_dynlock_lock_callback(void (*dyn_lock_function)(int mode, struct CRYPTO_dynlock_value *l, const char *file, int line)); +void CRYPTO_set_dynlock_destroy_callback(void (*dyn_destroy_function)(struct CRYPTO_dynlock_value *l, const char *file, int line)); +struct CRYPTO_dynlock_value *(*CRYPTO_get_dynlock_create_callback(void))(const char *file,int line); +void (*CRYPTO_get_dynlock_lock_callback(void))(int mode, struct CRYPTO_dynlock_value *l, const char *file,int line); +void (*CRYPTO_get_dynlock_destroy_callback(void))(struct CRYPTO_dynlock_value *l, const char *file,int line); /* CRYPTO_set_mem_functions includes CRYPTO_set_locked_mem_functions -- * call the latter last if you need different functions */ -- 2.25.1