From: Marc Fournier Date: Thu, 23 Jan 2014 13:18:08 +0000 (+0100) Subject: Merge remote-tracking branch 'origin/collectd-4.10' into collectd-5.3 X-Git-Tag: collectd-5.4.1~1^2 X-Git-Url: https://git.octo.it/?p=collectd.git;a=commitdiff_plain;h=7a762196fa7a4024c19ceac9b0c6918a5d8f62d5;hp=d2e9e78adec531d4c90460c9a39ccf6ed388cd69 Merge remote-tracking branch 'origin/collectd-4.10' into collectd-5.3 --- diff --git a/src/apache.c b/src/apache.c index 8458ce15..f0ab22a8 100644 --- a/src/apache.c +++ b/src/apache.c @@ -671,9 +671,18 @@ static int apache_read_host (user_data_t *user_data) /* {{{ */ return (0); } /* }}} int apache_read_host */ +static int apache_init (void) /* {{{ */ +{ + /* Call this while collectd is still single-threaded to avoid + * initialization issues in libgcrypt. */ + curl_global_init (CURL_GLOBAL_SSL); + return (0); +} /* }}} int apache_init */ + void module_register (void) { plugin_register_complex_config ("apache", config); + plugin_register_init ("apache", apache_init); } /* void module_register */ /* vim: set sw=8 noet fdm=marker : */ diff --git a/src/network.c b/src/network.c index 98cb8eba..1b6cf1ea 100644 --- a/src/network.c +++ b/src/network.c @@ -501,8 +501,15 @@ static void network_init_gcrypt (void) /* {{{ */ if (gcry_control (GCRYCTL_ANY_INITIALIZATION_P)) return; - gcry_check_version (NULL); /* before calling any other functions */ + /* http://www.gnupg.org/documentation/manuals/gcrypt/Multi_002dThreading.html + * To ensure thread-safety, it's important to set GCRYCTL_SET_THREAD_CBS + * *before* initalizing Libgcrypt with gcry_check_version(), which itself must + * be called before any other gcry_* function. GCRYCTL_ANY_INITIALIZATION_P + * above doesn't count, as it doesn't implicitly initalize Libgcrypt. + * + * tl;dr: keep all these gry_* statements in this exact order please. */ gcry_control (GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread); + gcry_check_version (NULL); gcry_control (GCRYCTL_INIT_SECMEM, 32768); gcry_control (GCRYCTL_INITIALIZATION_FINISHED); } /* }}} void network_init_gcrypt */