Explorar o código

--numeric-owner now affects private headers too

Problem reported by Daniel Peebles in:
http://lists.gnu.org/archive/html/bug-tar/2017-04/msg00004.html
* NEWS: Document this.
* src/create.c (write_gnu_long_link): If --numeric-owner,
leave the user and group empty in a private header.  Cache the
names for 0.
Paul Eggert %!s(int64=8) %!d(string=hai) anos
pai
achega
da8d0659a6
Modificáronse 2 ficheiros con 28 adicións e 21 borrados
  1. 12 9
      NEWS
  2. 16 12
      src/create.c

+ 12 - 9
NEWS

@@ -1,4 +1,4 @@
-GNU tar NEWS - User visible changes. 2016-10-29
+GNU tar NEWS - User visible changes. 2017-04-06
 Please send GNU tar bug reports to <[email protected]>
 
 
@@ -20,7 +20,7 @@ invoked as
    tar -cf a.tar . --exclude '*.o'
 
 tar will create the archive, but will exit with status 2, having
-issued the following error message   
+issued the following error message
 
    tar: The following options were used after any non-optional
    arguments in archive create or update mode.  These options are
@@ -28,7 +28,10 @@ issued the following error message
    rearrange them properly.
    tar: --exclude '*.o' has no effect
    tar: Exiting with failure status due to previous errors
-   
+
+* --numeric-owner now affects private headers too.
+This helps the output of 'tar' to be more deterministic.
+
 
 version 1.29 - Sergey Poznyakoff, 2016-05-16
 
@@ -52,7 +55,7 @@ the command line.  Its effect is reverted by the
 
 * --null option reads file names verbatim
 
-The --null option implies --verbatim-files-from.  I.e. each line 
+The --null option implies --verbatim-files-from.  I.e. each line
 read from null-delimited file lists is treated as a file name.
 
 This restores the documented behavior, which was broken in version
@@ -83,7 +86,7 @@ use the time specified if the file mtime is newer than the given time.
 The --clamp-mtime option can only be used together with	--mtime.
 
 Typical use case is to make builds reproducible: to loose less
-information, it's better to keep the original date of an archive, 
+information, it's better to keep the original date of an archive,
 except for files modified during the build process. In that case, using
 reference (and thus reproducible) timestamps for the latter is good
 enough.
@@ -131,7 +134,7 @@ sign and the specifier letter.
 	       deleted, correspondingly.
   %{FMT}t   -  Current local time using FMT as strftime(3) format.
                If {FMT} is omitted, use %c.
-  %{N}*     -  Pad output with spaces to the Nth column, or to the 
+  %{N}*     -  Pad output with spaces to the Nth column, or to the
                current screen width, if {N} is not given.
   %c        -  A shortcut for "%{%Y-%m-%d %H:%M:%S}t: %ds, %{read,wrote}T%*\r"
 
@@ -170,7 +173,7 @@ speed up archivation.
   --exclude-vcs-ignores   Read exclude tags from VCS ignore files,
                           where such files exist.  Supported VCS's
                           are: CVS, Git, Bazaar, Mercurial.
-			  
+
 
 * Tar refuses to read input from and write output to a tty device.
 
@@ -179,7 +182,7 @@ speed up archivation.
 This release includes official tar(1) and rmt(8) manpages.
 Distribution maintainers are kindly asked to use these instead of the
 home-made pages they have been providing so far.
-  
+
 
 version 1.27.1 - Sergey Poznyakoff, 2013-11-17
 
@@ -272,7 +275,7 @@ tar discovers that the corresponding file name already exists and is a
 symbolic link, it first unlinks the entry, and then extracts the directory.
 
 This option disables this behavior and instructs tar to follow
-symlinks to directories when extracting from the archive.  
+symlinks to directories when extracting from the archive.
 
 It is mainly intended to provide compatibility with the Slackware
 installation scripts.

+ 16 - 12
src/create.c

@@ -202,8 +202,8 @@ to_base256 (int negative, uintmax_t value, char *where, size_t size)
 #define MODE_TO_CHARS(val, where) mode_to_chars (val, where, sizeof (where))
 #define UID_TO_CHARS(val, where) uid_to_chars (val, where, sizeof (where))
 
-#define UNAME_TO_CHARS(name,buf) string_to_chars (name, buf, sizeof(buf))
-#define GNAME_TO_CHARS(name,buf) string_to_chars (name, buf, sizeof(buf))
+#define UNAME_TO_CHARS(name, buf) string_to_chars (name, buf, sizeof (buf))
+#define GNAME_TO_CHARS(name, buf) string_to_chars (name, buf, sizeof (buf))
 
 static bool
 to_chars (int negative, uintmax_t value, size_t valsize,
@@ -542,15 +542,19 @@ write_gnu_long_link (struct tar_stat_info *st, const char *p, char type)
   size_t size = strlen (p) + 1;
   size_t bufsize;
   union block *header;
-  char *tmpname;
 
   header = start_private_header ("././@LongLink", size, 0);
-  uid_to_uname (0, &tmpname);
-  UNAME_TO_CHARS (tmpname, header->header.uname);
-  free (tmpname);
-  gid_to_gname (0, &tmpname);
-  GNAME_TO_CHARS (tmpname, header->header.gname);
-  free (tmpname);
+  if (! numeric_owner_option)
+    {
+      static char *uname, *gname;
+      if (!uname)
+	{
+	  uid_to_uname (0, &uname);
+	  gid_to_gname (0, &gname);
+	}
+      UNAME_TO_CHARS (uname, header->header.uname);
+      GNAME_TO_CHARS (gname, header->header.gname);
+    }
 
   strcpy (header->buffer + offsetof (struct posix_header, magic),
 	  OLDGNU_MAGIC);
@@ -743,7 +747,7 @@ start_header (struct tar_stat_info *st)
   union block *header;
   char const *uname = NULL;
   char const *gname = NULL;
-  
+
   header = write_header_name (st);
   if (!header)
     return NULL;
@@ -830,11 +834,11 @@ start_header (struct tar_stat_info *st)
       case USE_FILE_MTIME:
 	mtime = st->mtime;
 	break;
-	  
+
       case FORCE_MTIME:
 	mtime = mtime_option;
 	break;
-	  
+
       case CLAMP_MTIME:
 	mtime = timespec_cmp (st->mtime, mtime_option) > 0
 	           ? mtime_option : st->mtime;