Use CURLOPT_NOSIGNAL to fix crashes on update check (#2495).
[dcpomatic.git] / src / lib / update_checker.cc
index 29d41cd922e4ef880ffc88b4ba34a9ffac178471..3897b81d8876e2a7a8c7f2a06a37d5c9ce9482c3 100644 (file)
@@ -57,7 +57,7 @@ write_callback_wrapper (void* data, size_t size, size_t nmemb, void* user)
  *  do the work.
  */
 UpdateChecker::UpdateChecker ()
-       : _buffer (new char[BUFFER_SIZE])
+       : _buffer (BUFFER_SIZE)
        , _state (State::NOT_RUN)
 {
        _curl = curl_easy_init ();
@@ -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 ());
@@ -97,7 +98,6 @@ UpdateChecker::~UpdateChecker ()
        } catch (...) {}
 
        curl_easy_cleanup (_curl);
-       delete[] _buffer;
 }
 
 
@@ -136,13 +136,13 @@ UpdateChecker::thread ()
                        int r = curl_easy_perform (_curl);
                        if (r != CURLE_OK) {
                                set_state (State::FAILED);
-                               return;
+                               continue;
                        }
 
                        /* Parse the reply */
 
                        _buffer[_offset] = '\0';
-                       string s (_buffer);
+                       string s (_buffer.data());
                        cxml::Document doc ("Update");
                        doc.read_string (s);
 
@@ -181,7 +181,7 @@ size_t
 UpdateChecker::write_callback (void* data, size_t size, size_t nmemb)
 {
        size_t const t = min (size * nmemb, size_t (BUFFER_SIZE - _offset - 1));
-       memcpy (_buffer + _offset, data, t);
+       memcpy (_buffer.data() + _offset, data, t);
        _offset += t;
        return t;
 }
@@ -193,7 +193,6 @@ UpdateChecker::set_state (State s)
        {
                boost::mutex::scoped_lock lm (_data_mutex);
                _state = s;
-               _emits++;
        }
 
        emit (boost::bind(boost::ref(StateChanged)));