[libvirt] [PATCH] Call curl_global_init from virInitialize to avoid thread-safety issues
Matthias Bolte
matthias.bolte at googlemail.com
Mon Oct 8 19:52:33 UTC 2012
2012/10/8 Daniel P. Berrange <berrange at redhat.com>:
> On Sat, Oct 06, 2012 at 08:10:07PM +0200, Matthias Bolte wrote:
>> curl_global_init is not thread-safe. curl_easy_init might call
>> curl_global_init when it was no called before. But curl_easy_init
>> can be called from different threads by the ESX driver. Therefore,
>> call curl_global_init from virInitialize to stop curl_easy_init from
>> calling it.
>>
>> Reported by Benjamin Wang.
>> ---
>> configure.ac | 10 +++++++++-
>> src/libvirt.c | 8 ++++++++
>> src/xenapi/xenapi_driver.c | 1 -
>> 3 files changed, 17 insertions(+), 2 deletions(-)
>>
>> diff --git a/configure.ac b/configure.ac
>> index 6d50985..0013d9d 100644
>> --- a/configure.ac
>> +++ b/configure.ac
>> @@ -2299,9 +2299,12 @@ dnl
>>
>> LIBCURL_CFLAGS=""
>> LIBCURL_LIBS=""
>> +have_curl=no
>>
>> if test "$with_esx" = "yes" || test "$with_esx" = "check" || test "$with_xenapi" = "yes" || test "$with_xenapi" = "check"; then
>> PKG_CHECK_MODULES(LIBCURL, libcurl >= $LIBCURL_REQUIRED, [
>> + have_curl=yes
>> +
>> if test "$with_esx" = "check"; then
>> with_esx=yes
>> fi
>> @@ -2326,6 +2329,11 @@ if test "$with_esx" = "yes" || test "$with_esx" = "check" || test "$with_xenapi"
>> ])
>> fi
>>
>> +if test "$have_curl" = "yes" ; then
>> + AC_DEFINE_UNQUOTED([HAVE_LIBCURL], 1, [whether libcurl is available])
>> +fi
>> +AM_CONDITIONAL([HAVE_LIBCURL], [test "$have_curl" = "yes"])
>> +
>>
>> if test "$with_esx" = "yes" ; then
>> AC_DEFINE_UNQUOTED([WITH_ESX], 1, [whether ESX driver is enabled])
>> @@ -3081,7 +3089,7 @@ AC_MSG_NOTICE([Libraries])
>> AC_MSG_NOTICE([])
>> AC_MSG_NOTICE([ libxml: $LIBXML_CFLAGS $LIBXML_LIBS])
>> AC_MSG_NOTICE([ dlopen: $DLOPEN_LIBS])
>> -if test "$with_esx" = "yes" ; then
>> +if test "$have_curl" = "yes" ; then
>> AC_MSG_NOTICE([ libcurl: $LIBCURL_CFLAGS $LIBCURL_LIBS])
>> else
>> AC_MSG_NOTICE([ libcurl: no])
>> diff --git a/src/libvirt.c b/src/libvirt.c
>> index ada9a86..76e4401 100644
>> --- a/src/libvirt.c
>> +++ b/src/libvirt.c
>> @@ -41,6 +41,10 @@
>> # include <winsock2.h>
>> #endif
>>
>> +#ifdef HAVE_LIBCURL
>> +# include <curl/curl.h>
>> +#endif
>> +
>> #include "virterror_internal.h"
>> #include "logging.h"
>> #include "datatypes.h"
>> @@ -418,6 +422,10 @@ virInitialize(void)
>>
>> virNetTLSInit();
>>
>> +#if HAVE_LIBCURL
>> + curl_global_init(CURL_GLOBAL_DEFAULT);
>> +#endif
>> +
>> VIR_DEBUG("register drivers");
>>
>> #if HAVE_WINSOCK2_H
>> diff --git a/src/xenapi/xenapi_driver.c b/src/xenapi/xenapi_driver.c
>> index 2fac561..d60ad23 100644
>> --- a/src/xenapi/xenapi_driver.c
>> +++ b/src/xenapi/xenapi_driver.c
>> @@ -171,7 +171,6 @@ xenapiOpen (virConnectPtr conn, virConnectAuthPtr auth,
>> xmlInitParser();
>> xmlKeepBlanksDefault(0);
>> xen_init();
>> - curl_global_init(CURL_GLOBAL_ALL);
>>
>> privP->session = xen_session_login_with_password(call_func, privP, username,
>> password, xen_api_latest_version);
>
> ACK
Thanks, pushed.
--
Matthias Bolte
http://photron.blogspot.com
More information about the libvir-list
mailing list