Loading crypto/cryptlib.c +42 −13 Original line number Diff line number Diff line Loading @@ -123,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; Loading Loading @@ -200,6 +200,10 @@ int CRYPTO_get_new_dynlockid(void) } CRYPTO_w_lock(CRYPTO_LOCK_DYNLOCK); /* 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); Loading Loading @@ -273,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, Loading @@ -297,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)) { Loading Loading @@ -373,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); Loading crypto/crypto.h +7 −8 Original line number Diff line number Diff line Loading @@ -312,17 +312,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 */ Loading doc/crypto/threads.pod +9 −5 Original line number Diff line number Diff line Loading @@ -17,14 +17,15 @@ CRYPTO_set_locking_callback, CRYPTO_set_id_callback - OpenSSL thread support /* struct CRYPTO_dynlock_value needs to be defined by the user */ typedef struct CRYPTO_dynlock_value CRYPTO_dynlock; struct CRYPTO_dynlock_value; void CRYPTO_set_dynlock_create_callback(CRYPTO_dynlock *(*dyn_create_function) (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, CRYPTO_dynlock *l, const char *file, int line)); (int mode, struct CRYPTO_dynlock_value *l, const char *file, int line)); void CRYPTO_set_dynlock_destroy_callback(void (*dyn_destroy_function) (CRYPTO_dynlock *l, const char *file, int line)); (struct CRYPTO_dynlock_value *l, const char *file, int line)); int CRYPTO_get_new_dynlockid(void); Loading Loading @@ -115,6 +116,9 @@ You can find out if OpenSSL was configured with thread support: // no thread support #endif Also, dynamic locks are currently not used internally by OpenSSL, but may do so in the future. =head1 EXAMPLES B<crypto/threads/mttest.c> shows examples of the callback functions on Loading util/libeay.num +51 −0 Original line number Diff line number Diff line Loading @@ -1838,3 +1838,54 @@ CRYPTO_destroy_dynlockid 2413 CRYPTO_set_dynlock_size 2414 CRYPTO_set_dynlock_create_callback 2415 CRYPTO_set_dynlock_lock_callback 2416 CRYPTO_get_dynlock_lock_callback 2417 CRYPTO_get_dynlock_destroy_callback 2418 CRYPTO_get_dynlock_value 2419 CRYPTO_get_dynlock_create_callback 2420 ERR_load_ENGINE_strings 2421 ENGINE_set_DSA 2422 ENGINE_get_default_RSA 2423 ENGINE_get_BN_mod_exp 2424 DSA_get_default_openssl_method 2425 ENGINE_set_DH 2426 ENGINE_set_default_BN_mod_exp_crt 2427 ENGINE_init 2428 DH_get_default_openssl_method 2429 RSA_set_default_openssl_method 2430 ENGINE_finish 2431 ENGINE_get_DH 2432 ENGINE_set_default_DSA 2433 ENGINE_get_name 2434 ENGINE_get_last 2435 ENGINE_get_prev 2436 ENGINE_get_default_DH 2437 ENGINE_get_RSA 2438 ENGINE_set_default 2439 ENGINE_get_RAND 2440 ENGINE_get_first 2441 ENGINE_by_id 2442 ENGINE_get_default_BN_mod_exp_crt 2443 RSA_get_default_openssl_method 2444 ENGINE_set_RSA 2445 ENGINE_set_default_RAND 2446 ENGINE_set_BN_mod_exp 2447 ENGINE_remove 2448 ENGINE_free 2449 ENGINE_get_BN_mod_exp_crt 2450 ENGINE_get_next 2451 ENGINE_set_name 2452 ENGINE_get_default_DSA 2453 ENGINE_set_default_BN_mod_exp 2454 ENGINE_set_default_RSA 2455 ENGINE_get_default_RAND 2456 ENGINE_get_default_BN_mod_exp 2457 ENGINE_set_RAND 2458 ENGINE_set_id 2459 ENGINE_set_BN_mod_exp_crt 2460 ENGINE_set_default_DH 2461 ENGINE_new 2462 ENGINE_get_id 2463 DSA_set_default_openssl_method 2464 ENGINE_add 2465 DH_set_default_openssl_method 2466 ENGINE_get_DSA 2467 Loading
crypto/cryptlib.c +42 −13 Original line number Diff line number Diff line Loading @@ -123,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; Loading Loading @@ -200,6 +200,10 @@ int CRYPTO_get_new_dynlockid(void) } CRYPTO_w_lock(CRYPTO_LOCK_DYNLOCK); /* 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); Loading Loading @@ -273,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, Loading @@ -297,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)) { Loading Loading @@ -373,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); Loading
crypto/crypto.h +7 −8 Original line number Diff line number Diff line Loading @@ -312,17 +312,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 */ Loading
doc/crypto/threads.pod +9 −5 Original line number Diff line number Diff line Loading @@ -17,14 +17,15 @@ CRYPTO_set_locking_callback, CRYPTO_set_id_callback - OpenSSL thread support /* struct CRYPTO_dynlock_value needs to be defined by the user */ typedef struct CRYPTO_dynlock_value CRYPTO_dynlock; struct CRYPTO_dynlock_value; void CRYPTO_set_dynlock_create_callback(CRYPTO_dynlock *(*dyn_create_function) (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, CRYPTO_dynlock *l, const char *file, int line)); (int mode, struct CRYPTO_dynlock_value *l, const char *file, int line)); void CRYPTO_set_dynlock_destroy_callback(void (*dyn_destroy_function) (CRYPTO_dynlock *l, const char *file, int line)); (struct CRYPTO_dynlock_value *l, const char *file, int line)); int CRYPTO_get_new_dynlockid(void); Loading Loading @@ -115,6 +116,9 @@ You can find out if OpenSSL was configured with thread support: // no thread support #endif Also, dynamic locks are currently not used internally by OpenSSL, but may do so in the future. =head1 EXAMPLES B<crypto/threads/mttest.c> shows examples of the callback functions on Loading
util/libeay.num +51 −0 Original line number Diff line number Diff line Loading @@ -1838,3 +1838,54 @@ CRYPTO_destroy_dynlockid 2413 CRYPTO_set_dynlock_size 2414 CRYPTO_set_dynlock_create_callback 2415 CRYPTO_set_dynlock_lock_callback 2416 CRYPTO_get_dynlock_lock_callback 2417 CRYPTO_get_dynlock_destroy_callback 2418 CRYPTO_get_dynlock_value 2419 CRYPTO_get_dynlock_create_callback 2420 ERR_load_ENGINE_strings 2421 ENGINE_set_DSA 2422 ENGINE_get_default_RSA 2423 ENGINE_get_BN_mod_exp 2424 DSA_get_default_openssl_method 2425 ENGINE_set_DH 2426 ENGINE_set_default_BN_mod_exp_crt 2427 ENGINE_init 2428 DH_get_default_openssl_method 2429 RSA_set_default_openssl_method 2430 ENGINE_finish 2431 ENGINE_get_DH 2432 ENGINE_set_default_DSA 2433 ENGINE_get_name 2434 ENGINE_get_last 2435 ENGINE_get_prev 2436 ENGINE_get_default_DH 2437 ENGINE_get_RSA 2438 ENGINE_set_default 2439 ENGINE_get_RAND 2440 ENGINE_get_first 2441 ENGINE_by_id 2442 ENGINE_get_default_BN_mod_exp_crt 2443 RSA_get_default_openssl_method 2444 ENGINE_set_RSA 2445 ENGINE_set_default_RAND 2446 ENGINE_set_BN_mod_exp 2447 ENGINE_remove 2448 ENGINE_free 2449 ENGINE_get_BN_mod_exp_crt 2450 ENGINE_get_next 2451 ENGINE_set_name 2452 ENGINE_get_default_DSA 2453 ENGINE_set_default_BN_mod_exp 2454 ENGINE_set_default_RSA 2455 ENGINE_get_default_RAND 2456 ENGINE_get_default_BN_mod_exp 2457 ENGINE_set_RAND 2458 ENGINE_set_id 2459 ENGINE_set_BN_mod_exp_crt 2460 ENGINE_set_default_DH 2461 ENGINE_new 2462 ENGINE_get_id 2463 DSA_set_default_openssl_method 2464 ENGINE_add 2465 DH_set_default_openssl_method 2466 ENGINE_get_DSA 2467