aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/threading.dox1
-rw-r--r--include/libssh/callbacks.h2
-rw-r--r--src/threads.c25
3 files changed, 26 insertions, 2 deletions
diff --git a/doc/threading.dox b/doc/threading.dox
index a11c82f7..95eee6bb 100644
--- a/doc/threading.dox
+++ b/doc/threading.dox
@@ -61,5 +61,6 @@ implement the following methods :
- mutex_destroy
- thread_id
+libgcrypt 1.6 and bigger backend does not support custom callback. Using anything else than pthreads (ssh_threads_get_pthread()) here will fail.
Good luck !
*/
diff --git a/include/libssh/callbacks.h b/include/libssh/callbacks.h
index a841f2e5..9aa8bab7 100644
--- a/include/libssh/callbacks.h
+++ b/include/libssh/callbacks.h
@@ -801,6 +801,8 @@ struct ssh_threads_callbacks_struct {
*
* @see ssh_threads_callbacks_struct
* @see SSH_THREADS_PTHREAD
+ * @bug libgcrypt 1.6 and bigger backend does not support custom callback.
+ * Using anything else than pthreads here will fail.
*/
LIBSSH_API int ssh_threads_set_callbacks(struct ssh_threads_callbacks_struct
*cb);
diff --git a/src/threads.c b/src/threads.c
index 107c65d2..7f3a304e 100644
--- a/src/threads.c
+++ b/src/threads.c
@@ -59,8 +59,28 @@ struct ssh_threads_callbacks_struct *ssh_threads_get_noop(void) {
static struct ssh_threads_callbacks_struct *user_callbacks =&ssh_threads_noop;
#ifdef HAVE_LIBGCRYPT
+#if (GCRYPT_VERSION_NUMBER >= 0x010600)
+/* libgcrypt >= 1.6 does not support custom callbacks */
+GCRY_THREAD_OPTION_PTHREAD_IMPL;
-/* Libgcrypt specific way of handling thread callbacks */
+static int libgcrypt_thread_init(void){
+ if(user_callbacks == NULL)
+ return SSH_ERROR;
+ if(user_callbacks == &ssh_threads_noop)
+ return SSH_OK;
+ if (strcmp(user_callbacks->type, "threads_pthread") == 0){
+ gcry_control (GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread);
+ return SSH_OK;
+ } else {
+ /* not supported */
+ SSH_LOG(SSH_LOG_WARN, "Custom thread handlers not supported with libgcrypt >=1.6, using pthreads");
+ gcry_control (GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread);
+ return SSH_OK;
+ }
+}
+
+#else
+/* Libgcrypt < 1.6 specific way of handling thread callbacks */
static struct gcry_thread_cbs gcrypt_threads_callbacks;
@@ -79,7 +99,8 @@ static int libgcrypt_thread_init(void){
gcry_control(GCRYCTL_SET_THREAD_CBS, &gcrypt_threads_callbacks);
return SSH_OK;
}
-#else
+#endif /* GCRYPT_VERSION_NUMBER */
+#else /* HAVE_LIBGCRYPT */
/* Libcrypto specific stuff */