X-Git-Url: https://git.openssl.org/gitweb/?a=blobdiff_plain;f=crypto%2Fcryptlib.c;h=8634c078d8f376a55b7b19c5ea1482bb5acb77f6;hb=620cea37e0f904cb823a9c4bd84206d94622ea54;hp=4bad40c2dfe3423c415c5b15213bb1ab2e13ac8c;hpb=e73a6965e374270971d730f5886b6ecc214e609f;p=openssl.git diff --git a/crypto/cryptlib.c b/crypto/cryptlib.c index 4bad40c2df..8634c078d8 100644 --- a/crypto/cryptlib.c +++ b/crypto/cryptlib.c @@ -66,8 +66,8 @@ static double SSLeay_MSVC5_hack=0.0; /* and for VC1.5 */ #endif -DECLARE_STACK_OF(CRYPTO_dynlock); -IMPLEMENT_STACK_OF(CRYPTO_dynlock); +DECLARE_STACK_OF(CRYPTO_dynlock) +IMPLEMENT_STACK_OF(CRYPTO_dynlock) /* real #defines in crypto.h, keep these upto date */ static const char* lock_names[CRYPTO_NUM_LOCKS] = @@ -100,7 +100,8 @@ static const char* lock_names[CRYPTO_NUM_LOCKS] = "debug_malloc2", "dso", "dynlock", -#if CRYPTO_NUM_LOCKS != 28 + "engine", +#if CRYPTO_NUM_LOCKS != 29 # error "Inconsistency between crypto.h and cryptlib.c" #endif }; @@ -122,7 +123,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; @@ -132,11 +133,11 @@ int CRYPTO_get_new_lockid(char *name) char *str; int i; +#if defined(WIN32) || defined(WIN16) /* A hack to make Visual C++ 5.0 work correctly when linking as * a DLL using /MT. Without this, the application cannot use * and floating point printf's. * It also seems to be needed for Visual C 1.5 (win16) */ -#if defined(WIN32) || defined(WIN16) SSLeay_MSVC5_hack=(double)name[0]*(double)name[1]; #endif @@ -175,7 +176,7 @@ int CRYPTO_get_new_dynlockid(void) } CRYPTO_w_lock(CRYPTO_LOCK_DYNLOCK); if ((dyn_locks == NULL) - && ((dyn_locks=sk_new_null()) == NULL)) + && ((dyn_locks=sk_CRYPTO_dynlock_new_null()) == NULL)) { CRYPTO_w_unlock(CRYPTO_LOCK_DYNLOCK); CRYPTOerr(CRYPTO_F_CRYPTO_GET_NEW_DYNLOCKID,ERR_R_MALLOC_FAILURE); @@ -199,7 +200,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) @@ -246,7 +251,10 @@ void CRYPTO_destroy_dynlockid(int i) CRYPTO_w_unlock(CRYPTO_LOCK_DYNLOCK); if (pointer) + { dynlock_destroy_callback(pointer->data,__FILE__,__LINE__); + OPENSSL_free(pointer); + } } struct CRYPTO_dynlock_value *CRYPTO_get_dynlock_value(int i) @@ -269,16 +277,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, @@ -293,12 +332,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)) { @@ -369,7 +402,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);