@@ -214,9 +214,19 @@ void BoltSecurityContext_destroy(BoltSecurityContext* context)
214214
215215static mutex_t * locks ;
216216
217- unsigned long secure_openssl_id_callback (void );
217+ struct CRYPTO_dynlock_value {
218+ mutex_t mutex ;
219+ };
218220
219- void secure_openssl_locking_callback (int mode , int type , const char * file , int line );
221+ static unsigned long secure_openssl_id_callback (void );
222+
223+ static void secure_openssl_locking_callback (int mode , int type , const char * file , int line );
224+
225+ static struct CRYPTO_dynlock_value * secure_openssl_create_mutex (const char * file , int line );
226+
227+ static void secure_openssl_lock_mutext (int mode , struct CRYPTO_dynlock_value * l , const char * file , int line );
228+
229+ static void secure_openssl_destroy_mutex (struct CRYPTO_dynlock_value * l , const char * file , int line );
220230
221231void CRYPTO_thread_setup (void )
222232{
@@ -230,21 +240,31 @@ void CRYPTO_thread_setup(void)
230240 BoltSync_mutex_create (& locks [i ]);
231241 }
232242
233- CRYPTO_set_id_callback (& secure_openssl_id_callback );
234- CRYPTO_set_locking_callback (& secure_openssl_locking_callback );
243+ CRYPTO_set_id_callback (secure_openssl_id_callback );
244+ CRYPTO_set_locking_callback (secure_openssl_locking_callback );
245+
246+ CRYPTO_set_dynlock_create_callback (secure_openssl_create_mutex );
247+ CRYPTO_set_dynlock_lock_callback (secure_openssl_lock_mutext );
248+ CRYPTO_set_dynlock_destroy_callback (secure_openssl_destroy_mutex );
235249}
236250
237- static void CRYPTO_thread_cleanup (void )
251+ void CRYPTO_thread_cleanup (void )
238252{
239- int i ;
253+ CRYPTO_set_id_callback (NULL );
254+ CRYPTO_set_locking_callback (NULL );
255+
256+ CRYPTO_set_dynlock_create_callback (NULL );
257+ CRYPTO_set_dynlock_lock_callback (NULL );
258+ CRYPTO_set_dynlock_destroy_callback (NULL );
240259
241260 CRYPTO_set_locking_callback (NULL );
242- for (i = 0 ; i < CRYPTO_num_locks (); i ++ )
261+ for (int i = 0 ; i < CRYPTO_num_locks (); i ++ ) {
243262 BoltSync_mutex_destroy (& locks [i ]);
263+ }
244264 OPENSSL_free (locks );
245265}
246266
247- void secure_openssl_locking_callback (int mode , int type , const char * file , int line )
267+ static void secure_openssl_locking_callback (int mode , int type , const char * file , int line )
248268{
249269 UNUSED (file );
250270 UNUSED (line );
@@ -257,18 +277,52 @@ void secure_openssl_locking_callback(int mode, int type, const char* file, int l
257277 }
258278}
259279
260- unsigned long secure_openssl_id_callback (void )
280+ static unsigned long secure_openssl_id_callback (void )
261281{
262282 return BoltThread_id ();
263283}
264284
285+ static struct CRYPTO_dynlock_value * secure_openssl_create_mutex (const char * file , int line )
286+ {
287+ UNUSED (file );
288+ UNUSED (line );
289+
290+ struct CRYPTO_dynlock_value * value ;
291+ value = (struct CRYPTO_dynlock_value * ) malloc (sizeof (struct CRYPTO_dynlock_value ));
292+ if (!value ) return NULL ;
293+ BoltSync_mutex_create (& value -> mutex );
294+ return value ;
295+ }
296+
297+ static void secure_openssl_lock_mutext (int mode , struct CRYPTO_dynlock_value * l , const char * file , int line )
298+ {
299+ UNUSED (file );
300+ UNUSED (line );
301+
302+ if (mode & CRYPTO_LOCK ) {
303+ BoltSync_mutex_lock (& l -> mutex );
304+ }
305+ else {
306+ BoltSync_mutex_unlock (& l -> mutex );
307+ }
308+ }
309+
310+ static void secure_openssl_destroy_mutex (struct CRYPTO_dynlock_value * l , const char * file , int line )
311+ {
312+ UNUSED (file );
313+ UNUSED (line );
314+
315+ BoltSync_mutex_destroy (& l -> mutex );
316+ free (l );
317+ }
318+
265319#endif
266320
267321int BoltSecurityContext_startup ()
268322{
269323#if OPENSSL_VERSION_NUMBER < 0x10100000L
270- SSL_library_init ();
271324 CRYPTO_thread_setup ();
325+ SSL_library_init ();
272326#else
273327 OPENSSL_init_ssl (0 , NULL );
274328#endif
0 commit comments