You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

94 lines
2.5 KiB

From 43332a4fa12ff79f284749177dc0743a495caea6 Mon Sep 17 00:00:00 2001
From: Nicolas Chauvet <kwizart@gmail.com>
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 <errno.h>
+#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