diff options
author | Brad King <brad.king@kitware.com> | 2024-08-13 19:06:14 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2024-08-13 19:07:53 (GMT) |
commit | 7486f468fb982f8362252b70987aca13ddf95690 (patch) | |
tree | 844073e736860b96816a8d2469cf01e940d7f06a | |
parent | d88682dff6bf053e5bbdc10accf5d6825303e656 (diff) | |
download | CMake-7486f468fb982f8362252b70987aca13ddf95690.zip CMake-7486f468fb982f8362252b70987aca13ddf95690.tar.gz CMake-7486f468fb982f8362252b70987aca13ddf95690.tar.bz2 |
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
-rw-r--r-- | Source/CTest/cmCTestCurl.cxx | 2 | ||||
-rw-r--r-- | Source/CTest/cmCTestSubmitHandler.cxx | 2 | ||||
-rw-r--r-- | Source/cmCurl.cxx | 12 | ||||
-rw-r--r-- | Source/cmCurl.h | 2 | ||||
-rw-r--r-- | 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<std::string> 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<std::string> 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); |