Преглед изворни кода

file(DOWNLOAD): Handle write errors

Hanjiang Yu пре 7 месеци
родитељ
комит
9476245dcd

+ 11 - 8
Source/cmFileCommand.cxx

@@ -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) {

+ 7 - 0
Tests/RunCMake/file-DOWNLOAD/RunCMakeTest.cmake

@@ -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()

+ 3 - 1
Tests/RunCMake/file-DOWNLOAD/common.cmake

@@ -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}"

+ 1 - 0
Tests/RunCMake/file-DOWNLOAD/file-write-error-stdout.txt

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

+ 3 - 0
Tests/RunCMake/file-DOWNLOAD/file-write-error.cmake

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