From 43332a4fa12ff79f284749177dc0743a495caea6 Mon Sep 17 00:00:00 2001 From: Nicolas Chauvet Date: Sat, 18 Jul 2020 15:19:31 +0200 Subject: [PATCH 1/1] Restore support for thread callbacks for older gcrypt --- include/vlc_gcrypt.h | 64 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/include/vlc_gcrypt.h b/include/vlc_gcrypt.h index a04e1b1d86..4c7f1e86b0 100644 --- a/include/vlc_gcrypt.h +++ b/include/vlc_gcrypt.h @@ -25,6 +25,67 @@ #include +#if GCRYPT_VERSION_NUMBER < 0x010600 +#ifdef LIBVLC_USE_PTHREAD +/** + * If possible, use gcrypt-provided thread implementation. This is so that + * other non-VLC components (inside the process) can also use gcrypt safely. + */ +GCRY_THREAD_OPTION_PTHREAD_IMPL; +# define gcry_threads_vlc gcry_threads_pthread +#else + +/** + * gcrypt thread option VLC implementation + */ + +static int gcry_vlc_mutex_init( void **p_sys ) +{ + vlc_mutex_t *p_lock = (vlc_mutex_t *)malloc( sizeof( vlc_mutex_t ) ); + if( p_lock == NULL) + return ENOMEM; + + vlc_mutex_init( p_lock ); + *p_sys = p_lock; + return VLC_SUCCESS; +} + +static int gcry_vlc_mutex_destroy( void **p_sys ) +{ + vlc_mutex_t *p_lock = (vlc_mutex_t *)*p_sys; + vlc_mutex_destroy( p_lock ); + free( p_lock ); + return VLC_SUCCESS; +} + +static int gcry_vlc_mutex_lock( void **p_sys ) +{ + vlc_mutex_lock( (vlc_mutex_t *)*p_sys ); + return VLC_SUCCESS; +} + +static int gcry_vlc_mutex_unlock( void **lock ) +{ + vlc_mutex_unlock( (vlc_mutex_t *)*lock ); + return VLC_SUCCESS; +} + +static const struct gcry_thread_cbs gcry_threads_vlc = +{ + GCRY_THREAD_OPTION_USER, + NULL, + gcry_vlc_mutex_init, + gcry_vlc_mutex_destroy, + gcry_vlc_mutex_lock, + gcry_vlc_mutex_unlock, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL +}; +#endif +#endif + +/** + * Initializes gcrypt with proper locking. + */ static inline void vlc_gcrypt_init (void) { /* This would need a process-wide static mutex with all libraries linking @@ -37,6 +98,9 @@ static inline void vlc_gcrypt_init (void) vlc_global_lock (VLC_GCRYPT_MUTEX); if (!done) { +#if GCRYPT_VERSION_NUMBER < 0x010600 + gcry_control (GCRYCTL_SET_THREAD_CBS, &gcry_threads_vlc); +#endif /* The suggested way for an application to make sure that global_init * has been called is by using gcry_check_version. (see global_init * comments in gcrypt sources) */ -- 2.25.4