2012/10/8 Daniel P. Berrange <berrange(a)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