2012/10/1 Michal Privoznik <mprivozn@xxxxxxxxxx>: > On 29.09.2012 22:17, Matthias Bolte wrote: >> libcurl uses a SIGALRM in combination with sigsetjmp/siglongjmp to be >> able to abort a DNS lookup when it takes too long. The problem with this >> in a multi-threaded application is that the signal handler for SIGALRM >> and the call to siglongjmp can be executed on a thread that is different >> from the one that initially did the SIGALRM setup and the call to >> sigsetjmp. In the reported case this triggered a segfault. >> >> Disable libcurl's use of signals to avoid this situation. This has the >> disadvantage of losing the ability to abort DNS lookups which might result >> in libcurl getting stuck in a DNS lookup in the worst case. >> >> Reported by Benjamin Wang. >> --- >> >> src/esx/esx_vi.c | 1 + >> 1 files changed, 1 insertions(+), 0 deletions(-) >> >> diff --git a/src/esx/esx_vi.c b/src/esx/esx_vi.c >> index 275b858..125eaee 100644 >> --- a/src/esx/esx_vi.c >> +++ b/src/esx/esx_vi.c >> @@ -330,6 +330,7 @@ esxVI_CURL_Connect(esxVI_CURL *curl, esxUtil_ParsedUri *parsedUri) >> } >> >> curl_easy_setopt(curl->handle, CURLOPT_USERAGENT, "libvirt-esx"); >> + curl_easy_setopt(curl->handle, CURLOPT_NOSIGNAL, 1); >> curl_easy_setopt(curl->handle, CURLOPT_HEADER, 0); >> curl_easy_setopt(curl->handle, CURLOPT_FOLLOWLOCATION, 0); >> curl_easy_setopt(curl->handle, CURLOPT_SSL_VERIFYPEER, >> > > I think this is safe; From the version 7.10 curl can still timeout on > DNS lookup even with CURLOPT_NOSIGNAL set: > > http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTNOSIGNAL > > So ACK. > > Michal libcurl supports different DNS backends. This problem only affects the synchronous one where libcurl uses the described timeout mechanism. The asynchronous c-ares backend is not affected. But as I don't see a better solution to avoid the thread-unsafety of the SIGALRM/sigsetjmp/siglongjmp combination I'll push thins one. Thanks. -- Matthias Bolte http://photron.blogspot.com -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list