file(DOWNLOAD): Handle write errors

This commit is contained in:
Hanjiang Yu
2025-03-23 10:58:36 +08:00
committed by Brad King
parent 1994393f7a
commit 9476245dcd
5 changed files with 25 additions and 9 deletions

View File

@@ -1703,7 +1703,9 @@ size_t cmWriteToFileCallback(void* ptr, size_t size, size_t nmemb, void* data)
cmsys::ofstream* fout = static_cast<cmsys::ofstream*>(data);
if (fout) {
char const* chPtr = static_cast<char*>(ptr);
fout->write(chPtr, realsize);
if (!fout->write(chPtr, realsize)) {
return CURL_WRITEFUNC_ERROR;
}
}
return realsize;
}
@@ -2283,6 +2285,14 @@ bool HandleDownloadCommand(std::vector<std::string> const& args,
g_curl.release();
::curl_easy_cleanup(curl);
// Explicitly close the file so we can check for write errors.
if (!file.empty()) {
fout.close();
if (!fout) {
res = CURLE_WRITE_ERROR;
}
}
if (!statusVar.empty()) {
std::string m = curl_easy_strerror(res);
if ((res == CURLE_SSL_CONNECT_ERROR ||
@@ -2306,13 +2316,6 @@ bool HandleDownloadCommand(std::vector<std::string> const& args,
status.GetMakefile().AddDefinition(logVar, chunkDebug.data());
}
// Explicitly flush/close so we can measure the md5 accurately.
//
if (!file.empty()) {
fout.flush();
fout.close();
}
// Verify MD5 sum if requested:
//
if (hash) {

View File

@@ -23,6 +23,13 @@ run_cmake(no-file)
run_cmake(range)
run_cmake(SHOW_PROGRESS)
foreach(file IN ITEMS /dev/full /dev/urandom)
if(IS_WRITABLE "${file}")
run_cmake_with_options(file-write-error -Dfile=${file})
break()
endif()
endforeach()
if(NOT CMake_TEST_NO_NETWORK)
run_cmake(bad-hostname)
endif()

View File

@@ -2,7 +2,9 @@ if(NOT "${CMAKE_CURRENT_SOURCE_DIR}" MATCHES "^/")
set(slash /)
endif()
set(url "file://${slash}${CMAKE_CURRENT_SOURCE_DIR}/input.png")
set(file ${CMAKE_CURRENT_BINARY_DIR}/output.png)
if (NOT file)
set(file ${CMAKE_CURRENT_BINARY_DIR}/output.png)
endif ()
function(file_download)
file(DOWNLOAD "${url}"

View File

@@ -0,0 +1 @@
-- status='23;"Failed writing received data to disk/application"'

View File

@@ -0,0 +1,3 @@
include(common.cmake)
file_download()