From 7486f468fb982f8362252b70987aca13ddf95690 Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 13 Aug 2024 15:06:14 -0400 Subject: curl: Avoid using HTTP/2 with curl 8.7.x due to bug in error codes curl 8.7.x has a bug in HTTP/2 error codes introduced by commit `0dc036225` (HTTP/2: write response directly, 2024-01-31, `curl-8_7_0~230`) and fixed by commit `5c59f9142` (http2 + ngtcp2: pass CURLcode errors from callbacks, 2024-04-18, `curl-8_8_0~181`). Fixes: #26200 --- Source/CTest/cmCTestCurl.cxx | 2 +- Source/CTest/cmCTestSubmitHandler.cxx | 2 +- Source/cmCurl.cxx | 12 ++++++++++++ Source/cmCurl.h | 2 ++ Source/cmFileCommand.cxx | 4 ++-- 5 files changed, 18 insertions(+), 4 deletions(-) diff --git a/Source/CTest/cmCTestCurl.cxx b/Source/CTest/cmCTestCurl.cxx index b8e5db1..7137e63 100644 --- a/Source/CTest/cmCTestCurl.cxx +++ b/Source/CTest/cmCTestCurl.cxx @@ -22,7 +22,7 @@ cmCTestCurl::cmCTestCurl(cmCTest* ctest) cmCurlInitOnce(); // In windows, this will init the winsock stuff ::curl_global_init(CURL_GLOBAL_ALL); - this->Curl = curl_easy_init(); + this->Curl = cm_curl_easy_init(); } cmCTestCurl::~cmCTestCurl() diff --git a/Source/CTest/cmCTestSubmitHandler.cxx b/Source/CTest/cmCTestSubmitHandler.cxx index 85c77be..fdf3178 100644 --- a/Source/CTest/cmCTestSubmitHandler.cxx +++ b/Source/CTest/cmCTestSubmitHandler.cxx @@ -177,7 +177,7 @@ bool cmCTestSubmitHandler::SubmitUsingHTTP( cmCTestCurlOpts curlOpts(this->CTest); for (std::string const& file : files) { /* get a curl handle */ - curl = curl_easy_init(); + curl = cm_curl_easy_init(); if (curl) { cmCurlSetCAInfo(curl); if (curlOpts.TLSVersionOpt) { diff --git a/Source/cmCurl.cxx b/Source/cmCurl.cxx index 65fccd0..51b95c3 100644 --- a/Source/cmCurl.cxx +++ b/Source/cmCurl.cxx @@ -226,3 +226,15 @@ std::string cmCurlFixFileURL(std::string url) return url; } + +::CURL* cm_curl_easy_init() +{ + ::CURL* curl = curl_easy_init(); + if (curl_version_info_data* cv = curl_version_info(CURLVERSION_FIRST)) { + // curl 8.7.x returns incorrect HTTP/2 error codes. + if (cv->version_num >= 0x080700 && cv->version_num < 0x080800) { + curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); + } + } + return curl; +} diff --git a/Source/cmCurl.h b/Source/cmCurl.h index bb2221f..2088e3d 100644 --- a/Source/cmCurl.h +++ b/Source/cmCurl.h @@ -18,3 +18,5 @@ std::string cmCurlSetCAInfo(::CURL* curl, const std::string& cafile = {}); std::string cmCurlSetNETRCOption(::CURL* curl, const std::string& netrc_level, const std::string& netrc_file); std::string cmCurlFixFileURL(std::string url); + +::CURL* cm_curl_easy_init(); diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx index 6265f82..4797c06 100644 --- a/Source/cmFileCommand.cxx +++ b/Source/cmFileCommand.cxx @@ -2117,7 +2117,7 @@ bool HandleDownloadCommand(std::vector const& args, ::CURL* curl; cmCurlInitOnce(); ::curl_global_init(CURL_GLOBAL_DEFAULT); - curl = ::curl_easy_init(); + curl = cm_curl_easy_init(); if (!curl) { status.SetError("DOWNLOAD error initializing curl."); return false; @@ -2491,7 +2491,7 @@ bool HandleUploadCommand(std::vector const& args, ::CURL* curl; cmCurlInitOnce(); ::curl_global_init(CURL_GLOBAL_DEFAULT); - curl = ::curl_easy_init(); + curl = cm_curl_easy_init(); if (!curl) { status.SetError("UPLOAD error initializing curl."); fclose(fin); -- cgit v0.12