Browse Source

numeric-owner: print big UID/GID correctly

* src/list.c (simple_print_header): Do not parse ustar header
for UID/GID again (tar_stat_info has already been correctly
filled with respect to possible uid/gid extended headers).
* tests/numeric.at: New testcase for --numeric-owner option.
* tests/Makefile.am: Add new testcase.
* tests/testsuite.at: Likewise.
Pavel Raiskup 9 years ago
parent
commit
68e9ab4966
4 changed files with 80 additions and 25 deletions
  1. 3 25
      src/list.c
  2. 1 0
      tests/Makefile.am
  3. 74 0
      tests/numeric.at
  4. 2 0
      tests/testsuite.at

+ 3 - 25
src/list.c

@@ -1,6 +1,6 @@
 /* List a tar archive, with support routines for reading a tar archive.
 
-   Copyright 1988, 1992-1994, 1996-2001, 2003-2007, 2010, 2012-2014 Free
+   Copyright 1988, 1992-1994, 1996-2001, 2003-2007, 2010, 2012-2015 Free
    Software Foundation, Inc.
 
    This file is part of GNU tar.
@@ -1219,18 +1219,7 @@ simple_print_header (struct tar_stat_info *st, union block *blk,
 	  && !numeric_owner_option)
 	user = st->uname;
       else
-	{
-	  /* Try parsing it as an unsigned integer first, and as a
-	     uid_t if that fails.  This method can list positive user
-	     ids that are too large to fit in a uid_t.  */
-	  uintmax_t u = from_header (blk->header.uid,
-				     sizeof blk->header.uid, 0,
-				     0, UINTMAX_MAX,
-				     false, false);
-	  user = (u != -1
-		  ? STRINGIFY_BIGINT (u, uform)
-		  : imaxtostr (UID_FROM_HEADER (blk->header.uid), uform));
-	}
+	user = STRINGIFY_BIGINT (st->stat.st_uid, uform);
 
       if (st->gname
 	  && st->gname[0]
@@ -1238,18 +1227,7 @@ simple_print_header (struct tar_stat_info *st, union block *blk,
 	  && !numeric_owner_option)
 	group = st->gname;
       else
-	{
-	  /* Try parsing it as an unsigned integer first, and as a
-	     gid_t if that fails.  This method can list positive group
-	     ids that are too large to fit in a gid_t.  */
-	  uintmax_t g = from_header (blk->header.gid,
-				     sizeof blk->header.gid, 0,
-				     0, UINTMAX_MAX,
-				     false, false);
-	  group = (g != -1
-		   ? STRINGIFY_BIGINT (g, gform)
-		   : imaxtostr (GID_FROM_HEADER (blk->header.gid), gform));
-	}
+	group = STRINGIFY_BIGINT (st->stat.st_gid, gform);
 
       /* Format the file size or major/minor device numbers.  */
 

+ 1 - 0
tests/Makefile.am

@@ -151,6 +151,7 @@ TESTSUITE_AT = \
  multiv06.at\
  multiv07.at\
  multiv08.at\
+ numeric.at\
  old.at\
  onetop01.at\
  onetop02.at\

+ 74 - 0
tests/numeric.at

@@ -0,0 +1,74 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+# Test suite for GNU tar.
+# Copyright 2015 Free Software Foundation, Inc.
+#
+# GNU tar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# GNU tar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+AT_SETUP([--numeric-owner basic tests])
+AT_KEYWORDS([options numeric numeric-owner])
+
+m4_pushdef([TESTOP],[
+decho $1
+tar $1 -vvf a dir --numeric-owner |dnl
+ awk -vowner=$MYUID/$MYGID '@S|@2==owner {print "OK"; next} {print}'
+tar $1 -vvf a dir |dnl
+ awk -vowner=$MYUSR/$MYGRP '@S|@2==owner {print "OK"; next} {print}'
+])
+
+AT_TAR_CHECK([
+mkdir dir
+genfile --file dir/file
+
+MYUID=$(id -u) || AT_SKIP_TEST
+MYGID=$(id -g) || AT_SKIP_TEST
+MYUSR=$(id -un) || AT_SKIP_TEST
+MYGRP=$(id -gn) || AT_SKIP_TEST
+
+TESTOP([--create])
+TESTOP([--list])
+TESTOP([--diff])
+TESTOP([--extract])
+],
+[0],
+[--create
+OK
+OK
+OK
+OK
+--list
+OK
+OK
+OK
+OK
+--diff
+OK
+OK
+OK
+OK
+--extract
+OK
+OK
+OK
+OK
+],
+[--create
+--list
+--diff
+--extract
+],[],[],[posix,gnu,ustar,oldgnu])
+
+AT_CLEANUP
+
+m4_popdef([TESTOP])
+

+ 2 - 0
tests/testsuite.at

@@ -230,6 +230,7 @@ m4_include([recurse.at])
 m4_include([recurs02.at])
 m4_include([shortrec.at])
 m4_include([iotty.at])
+m4_include([numeric.at])
 
 AT_BANNER([The --same-order option])
 m4_include([same-order01.at])
@@ -456,3 +457,4 @@ m4_include([star/ustar-big-2g.at])
 m4_include([star/ustar-big-8g.at])
 
 m4_include([star/pax-big-10g.at])
+