[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