Procházet zdrojové kódy

Fix for working with symlinks in tar files

Bill Hoffman před 16 roky
rodič
revize
79b8d61ae9
1 změnil soubory, kde provedl 29 přidání a 29 odebrání
  1. 29 29
      Source/cmSystemTools.cxx

+ 29 - 29
Source/cmSystemTools.cxx

@@ -1801,43 +1801,43 @@ bool cmSystemTools::CreateTar(const char* outFileName,
       }
     // Set the name of the entry to the file name
     archive_entry_set_pathname(entry, rp.c_str()); 
-    struct stat s;           
-    stat(fileIt->c_str(), &s);   
-    archive_read_disk_entry_from_file(disk, entry, -1, &s);
+    archive_read_disk_entry_from_file(disk, entry, -1, 0);
     CHECK_ARCHIVE_ERROR(res, "read disk entry:");
 
     // write  entry header
     res = archive_write_header(a, entry);
     CHECK_ARCHIVE_ERROR(res, "write header: ");
-
-    // now copy contents of file into archive a
-    FILE* file = fopen(fileIt->c_str(), "rb");
-    if(!file)
+    if(archive_entry_size(entry) > 0)
       {
-      cmSystemTools::Error("Problem with fopen(): ",
-                           fileIt->c_str());
-      return false;
-      }
-    char buff[16384];
-    size_t len = fread(buff, 1, sizeof(buff), file);
-    while (len > 0)
-      {
-      size_t wlen = archive_write_data(a, buff, len);
-      if(wlen != len)
-        { 
-        cmOStringStream error;
-        error << "Problem with archive_write_data\n"
-              << "Tried to write  [" << len << "] bytes.\n"
-              << "archive_write_data wrote  [" << wlen << "] bytes.\n";
-        cmSystemTools::Error(error.str().c_str(),
-                             archive_error_string(a)
-          );
-        return false;
+      // now copy contents of file into archive a
+      FILE* file = fopen(fileIt->c_str(), "rb");
+      if(!file)
+        {
+          cmSystemTools::Error("Problem with fopen(): ",
+                               fileIt->c_str());
+          return false;
+        }
+      char buff[16384];
+      size_t len = fread(buff, 1, sizeof(buff), file);
+      while (len > 0)
+        {
+          size_t wlen = archive_write_data(a, buff, len);
+          if(wlen != len)
+            { 
+              cmOStringStream error;
+              error << "Problem with archive_write_data\n"
+                    << "Tried to write  [" << len << "] bytes.\n"
+                    << "archive_write_data wrote  [" << wlen << "] bytes.\n";
+              cmSystemTools::Error(error.str().c_str(),
+                                   archive_error_string(a)
+                                   );
+              return false;
+            }
+          len = fread(buff, 1, sizeof(buff), file);
         }
-      len = fread(buff, 1, sizeof(buff), file);
+      // close the file and free the entry
+      fclose(file);
       }
-    // close the file and free the entry
-    fclose(file);
     archive_entry_free(entry);
     }
   // close the archive and finish the write