Use CURLOPT_NOSIGNAL to fix crashes on update check (#2495).
authorCarl Hetherington <cth@carlh.net>
Wed, 29 Mar 2023 23:25:25 +0000 (01:25 +0200)
committerCarl Hetherington <cth@carlh.net>
Wed, 29 Mar 2023 23:25:25 +0000 (01:25 +0200)
Without this, it's possible to come back from curl_easy_perform
in a different thread to the one that it was called from (in the case
of an error).

As I understand it, this happens because a signal handler is called
(from a different thread) and CURLOPT_NOSIGNAL stops this from
happening.

src/lib/update_checker.cc

index 2c2e23be165dfd04b293789a5babc96c5188841d..3897b81d8876e2a7a8c7f2a06a37d5c9ce9482c3 100644 (file)
@@ -66,6 +66,7 @@ UpdateChecker::UpdateChecker ()
        curl_easy_setopt (_curl, CURLOPT_WRITEFUNCTION, write_callback_wrapper);
        curl_easy_setopt (_curl, CURLOPT_WRITEDATA, this);
        curl_easy_setopt (_curl, CURLOPT_TIMEOUT, 20);
+       curl_easy_setopt (_curl, CURLOPT_NOSIGNAL, 1L);
 
        string const agent = "dcpomatic/" + string (dcpomatic_version);
        curl_easy_setopt (_curl, CURLOPT_USERAGENT, agent.c_str ());