From 87d3c3ba1abf9c1e4bb47b590a5bf084fd74ff06 Mon Sep 17 00:00:00 2001 From: Sergei Zimmerman Date: Wed, 19 Nov 2025 01:44:03 +0300 Subject: [PATCH] libstore/filetransfer: Handle exceptions in headerCallback Callbacks *must* never throw exceptions on the curl thread! --- src/libstore/filetransfer.cc | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/libstore/filetransfer.cc b/src/libstore/filetransfer.cc index 221e162a6..ba5e000b3 100644 --- a/src/libstore/filetransfer.cc +++ b/src/libstore/filetransfer.cc @@ -207,8 +207,8 @@ struct curlFileTransfer : public FileTransfer result.urls.push_back(effectiveUriCStr); } - size_t headerCallback(void * contents, size_t size, size_t nmemb) - { + size_t headerCallback(void * contents, size_t size, size_t nmemb) noexcept + try { size_t realSize = size * nmemb; std::string line((char *) contents, realSize); printMsg(lvlVomit, "got header for '%s': %s", request.uri, trim(line)); @@ -261,6 +261,15 @@ struct curlFileTransfer : public FileTransfer } } return realSize; + } catch (...) { +#if LIBCURL_VERSION_NUM >= 0x075700 + /* https://curl.se/libcurl/c/CURLOPT_HEADERFUNCTION.html: + You can also abort the transfer by returning CURL_WRITEFUNC_ERROR. */ + callbackException = std::current_exception(); + return CURL_WRITEFUNC_ERROR; +#else + return realSize; +#endif } static size_t headerCallbackWrapper(void * contents, size_t size, size_t nmemb, void * userp)