]> Dogcows Code - chaz/tar/commitdiff
tar: fix bug with sparse files with effective size of 8 GiB or more
authorPaul Eggert <eggert@cs.ucla.edu>
Sat, 26 Jan 2013 17:52:55 +0000 (09:52 -0800)
committerPaul Eggert <eggert@cs.ucla.edu>
Sat, 26 Jan 2013 17:54:02 +0000 (09:54 -0800)
Reported by Pavel Raiskup in
<http://lists.gnu.org/archive/html/bug-tar/2013-01/msg00001.html>.
* NEWS: Document the fix.
* src/sparse.c (pax_start_header): New function.
(pax_dump_header_0, pax_dump_header_1): Use it.

NEWS
src/sparse.c

diff --git a/NEWS b/NEWS
index e3726638a6591777c8d8fb60461dad9b5c340821..29b4486a0c573ca072cc9ff395d6e20913799c97 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,9 +1,16 @@
-GNU tar NEWS - User visible changes. 2013-01-01
+GNU tar NEWS - User visible changes. 2013-01-26
 Please send GNU tar bug reports to <bug-tar@gnu.org>
 
 \f
 version 1.26.90 (Git)
 
+* Bug fixes
+
+** Sparse files with large data
+
+When creating a PAX-format archive, tar no longer arbitrarily restricts
+the size of the representation of a sparse file to be less than 8 GiB.
+
 * Quoting
 
 In the default C locale, diagnostics and output of 'tar' have been
index b93cdc2953952ad1947e71125322ac805be2c7a1..417d4ff0aa37aca0c39550e77e9f6e62e39c7355 100644 (file)
@@ -917,6 +917,18 @@ pax_sparse_member_p (struct tar_sparse_file *file)
           || file->stat_info->sparse_major > 0;
 }
 
+/* Start a header that uses the effective (shrunken) file size.  */
+static union block *
+pax_start_header (struct tar_stat_info *st)
+{
+  off_t realsize = st->stat.st_size;
+  union block *blk;
+  st->stat.st_size = st->archive_file_size;
+  blk = start_header (st);
+  st->stat.st_size = realsize;
+  return blk;
+}
+
 static bool
 pax_dump_header_0 (struct tar_sparse_file *file)
 {
@@ -966,9 +978,7 @@ pax_dump_header_0 (struct tar_sparse_file *file)
          return false;
        }
     }
-  blk = start_header (file->stat_info);
-  /* Store the effective (shrunken) file size */
-  OFF_TO_CHARS (file->stat_info->archive_file_size, blk->header.size);
+  blk = pax_start_header (file->stat_info);
   finish_header (file->stat_info, blk, block_ordinal);
   if (save_file_name)
     {
@@ -1033,9 +1043,7 @@ pax_dump_header_1 (struct tar_sparse_file *file)
   if (strlen (file->stat_info->file_name) > NAME_FIELD_SIZE)
     file->stat_info->file_name[NAME_FIELD_SIZE] = 0;
 
-  blk = start_header (file->stat_info);
-  /* Store the effective (shrunken) file size */
-  OFF_TO_CHARS (file->stat_info->archive_file_size, blk->header.size);
+  blk = pax_start_header (file->stat_info);
   finish_header (file->stat_info, blk, block_ordinal);
   free (file->stat_info->file_name);
   file->stat_info->file_name = save_file_name;
This page took 0.029359 seconds and 4 git commands to generate.