From 6922ef551e5c1a76d88e124d62939c06e75babaa Mon Sep 17 00:00:00 2001 From: Billy Robert O'Neal III Date: Tue, 28 Oct 2025 20:32:32 -0700 Subject: [PATCH 1/3] Delete CurlRequestPrivateData --- src/vcpkg/base/downloads.cpp | 55 ++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 31 deletions(-) diff --git a/src/vcpkg/base/downloads.cpp b/src/vcpkg/base/downloads.cpp index 5c21798a5e..02dea28a0f 100644 --- a/src/vcpkg/base/downloads.cpp +++ b/src/vcpkg/base/downloads.cpp @@ -132,16 +132,10 @@ namespace vcpkg return true; } - struct CurlRequestPrivateData - { - size_t request_index = 0; - std::unique_ptr file = nullptr; - }; static size_t write_file_callback(void* contents, size_t size, size_t nmemb, void* param) { - auto* file = reinterpret_cast(param); - if (!file) return 0; - return file->write(contents, size, nmemb); + if (!param) return 0; + return static_cast(param)->write(contents, size, nmemb); } static size_t progress_callback(void* clientp, double dltotal, double dlnow, double ultotal, double ulnow) @@ -171,8 +165,8 @@ namespace vcpkg if (!multi_handle) Checks::unreachable(VCPKG_LINE_INFO); std::vector ret(urls.size(), -1); - std::vector private_data; - private_data.reserve(urls.size()); + std::vector write_pointers; + write_pointers.reserve(urls.size()); curl_slist* request_headers = nullptr; for (auto&& header : headers) @@ -182,7 +176,6 @@ namespace vcpkg for (size_t request_index = 0; request_index < urls.size(); ++request_index) { - auto& data = private_data.emplace_back(CurlRequestPrivateData{request_index}); const auto& url = urls[request_index]; CURL* curl = curl_easy_init(); @@ -195,24 +188,22 @@ namespace vcpkg } set_common_curl_options(curl, url.c_str(), request_headers); - curl_easy_setopt(curl, CURLOPT_PRIVATE, &data); - if (outputs.size() > request_index) - { - const auto& output = outputs[request_index]; + const auto& output = outputs[request_index]; - std::error_code ec; - data.file.reset(new WriteFilePointer(output, Append::NO, ec)); - if (ec) - { - context.report_error(format_filesystem_call_error(ec, "fopen", {output})); - } - else - { - curl_easy_setopt(curl, CURLOPT_WRITEDATA, data.file.get()); - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &write_file_callback); - } + std::error_code ec; + auto& request_write_pointer = write_pointers.emplace_back(output, Append::NO, ec); + curl_easy_setopt(curl, CURLOPT_PRIVATE, static_cast(&request_write_pointer)); + if (ec) + { + context.report_error(format_filesystem_call_error(ec, "fopen", {output})); + } + else + { + // note explicit cast to void* necessary to go through ... + curl_easy_setopt(curl, CURLOPT_WRITEDATA, static_cast(&request_write_pointer)); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &write_file_callback); + curl_multi_add_handle(multi_handle, curl); } - curl_multi_add_handle(multi_handle, curl); } int still_running = 0; @@ -245,11 +236,12 @@ namespace vcpkg if (msg->data.result == CURLE_OK) { - CurlRequestPrivateData* data = nullptr; - curl_easy_getinfo(handle, CURLINFO_PRIVATE, &data); - if (!data) Checks::unreachable(VCPKG_LINE_INFO); + void* curlinfo_private; + curl_easy_getinfo(handle, CURLINFO_PRIVATE, &curlinfo_private); + if (!curlinfo_private) Checks::unreachable(VCPKG_LINE_INFO); - auto idx = data->request_index; + auto request_write_handle = static_cast(curlinfo_private); + auto idx = request_write_handle - write_pointers.data(); long response_code = -1; curl_easy_getinfo(handle, CURLINFO_RESPONSE_CODE, &response_code); ret[idx] = static_cast(response_code); @@ -260,6 +252,7 @@ namespace vcpkg msg::exit_code = static_cast(msg->data.result), msg::error_msg = curl_easy_strerror(msg->data.result))); } + curl_multi_remove_handle(multi_handle, handle); curl_easy_cleanup(handle); } From 3a93a17b740842ea78e2b4c96936cd0b8c820920 Mon Sep 17 00:00:00 2001 From: Billy Robert O'Neal III Date: Tue, 28 Oct 2025 21:34:41 -0700 Subject: [PATCH 2/3] Restore "no outputs" behavior for "heads". --- src/vcpkg/base/downloads.cpp | 44 ++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/src/vcpkg/base/downloads.cpp b/src/vcpkg/base/downloads.cpp index 02dea28a0f..46741cd2f7 100644 --- a/src/vcpkg/base/downloads.cpp +++ b/src/vcpkg/base/downloads.cpp @@ -188,21 +188,27 @@ namespace vcpkg } set_common_curl_options(curl, url.c_str(), request_headers); - const auto& output = outputs[request_index]; - - std::error_code ec; - auto& request_write_pointer = write_pointers.emplace_back(output, Append::NO, ec); - curl_easy_setopt(curl, CURLOPT_PRIVATE, static_cast(&request_write_pointer)); - if (ec) + if (outputs.empty()) { - context.report_error(format_filesystem_call_error(ec, "fopen", {output})); + curl_easy_setopt(curl, CURLOPT_PRIVATE, reinterpret_cast(static_cast(request_index))); } else { - // note explicit cast to void* necessary to go through ... - curl_easy_setopt(curl, CURLOPT_WRITEDATA, static_cast(&request_write_pointer)); - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &write_file_callback); - curl_multi_add_handle(multi_handle, curl); + const auto& output = outputs[request_index]; + std::error_code ec; + auto& request_write_pointer = write_pointers.emplace_back(output, Append::NO, ec); + curl_easy_setopt(curl, CURLOPT_PRIVATE, static_cast(&request_write_pointer)); + if (ec) + { + context.report_error(format_filesystem_call_error(ec, "fopen", {output})); + } + else + { + // note explicit cast to void* necessary to go through ... + curl_easy_setopt(curl, CURLOPT_WRITEDATA, static_cast(&request_write_pointer)); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &write_file_callback); + curl_multi_add_handle(multi_handle, curl); + } } } @@ -236,13 +242,21 @@ namespace vcpkg if (msg->data.result == CURLE_OK) { + size_t idx; void* curlinfo_private; curl_easy_getinfo(handle, CURLINFO_PRIVATE, &curlinfo_private); - if (!curlinfo_private) Checks::unreachable(VCPKG_LINE_INFO); + if (outputs.empty()) + { + idx = reinterpret_cast(curlinfo_private); + } + else + { + if (!curlinfo_private) Checks::unreachable(VCPKG_LINE_INFO); + auto request_write_handle = static_cast(curlinfo_private); + auto idx = request_write_handle - write_pointers.data(); + } - auto request_write_handle = static_cast(curlinfo_private); - auto idx = request_write_handle - write_pointers.data(); - long response_code = -1; + long response_code; curl_easy_getinfo(handle, CURLINFO_RESPONSE_CODE, &response_code); ret[idx] = static_cast(response_code); } From 37701bd98e91e37a06e2105dd0c30adc229753d4 Mon Sep 17 00:00:00 2001 From: Billy Robert O'Neal III Date: Tue, 28 Oct 2025 21:35:02 -0700 Subject: [PATCH 3/3] oops --- src/vcpkg/base/downloads.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vcpkg/base/downloads.cpp b/src/vcpkg/base/downloads.cpp index 46741cd2f7..688cfbe6b6 100644 --- a/src/vcpkg/base/downloads.cpp +++ b/src/vcpkg/base/downloads.cpp @@ -253,7 +253,7 @@ namespace vcpkg { if (!curlinfo_private) Checks::unreachable(VCPKG_LINE_INFO); auto request_write_handle = static_cast(curlinfo_private); - auto idx = request_write_handle - write_pointers.data(); + idx = request_write_handle - write_pointers.data(); } long response_code;