UpdateChecker: fix segfault when checking for updates.

Couldn't have known the lambda would have caused issues.
This commit is contained in:
Guillaume Jacquemin 2023-10-29 15:26:26 +01:00
parent 088f357a6b
commit a7b0c894d0

View file

@ -37,6 +37,17 @@ UpdateChecker::~UpdateChecker() {
curl_global_cleanup(); curl_global_cleanup();
} }
inline
std::size_t
writeCallback(char* data, std::size_t size, std::size_t nmemb, void* user_data) {
if(!data || !user_data) return std::size_t{};
auto* s = static_cast<Containers::String*>(user_data);
(*s) = (*s) + Containers::StringView{data, size * nmemb};
return size * nmemb;
}
UpdateChecker::Result UpdateChecker::Result
UpdateChecker::check() { UpdateChecker::check() {
auto curl = curl_easy_init(); auto curl = curl_easy_init();
@ -48,16 +59,11 @@ UpdateChecker::check() {
Containers::String response_body{Containers::AllocatedInit, ""}; Containers::String response_body{Containers::AllocatedInit, ""};
Containers::String error_buffer{ValueInit, CURL_ERROR_SIZE}; Containers::String error_buffer{ValueInit, CURL_ERROR_SIZE};
static auto write_data = [](char* ptr, std::size_t size, std::size_t nmemb, Containers::String* buf){
if(!ptr || !buf) return std::size_t{};
(*buf) = Utility::format("{}{}", *buf, Containers::StringView{ptr, size * nmemb});
return size * nmemb;
};
curl_easy_setopt(curl, CURLOPT_URL, "https://williamjcm.ovh/mbst/version"); curl_easy_setopt(curl, CURLOPT_URL, "https://williamjcm.ovh/mbst/version");
curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L);
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L); curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response_body); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response_body);
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, error_buffer.data()); curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, error_buffer.data());
curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 0L); curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 0L);