bug-tar
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Bug-tar] [PATCH] numeric-owner: print big UID/GID correctly


From: Pavel Raiskup
Subject: [Bug-tar] [PATCH] numeric-owner: print big UID/GID correctly
Date: Tue, 29 Sep 2015 08:53:58 +0200

* 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 test-case for --numeric-owner option.
This does not guard against issue fixed by this commit as we would
need 'useradd -u 16777216' call and thus root account.  Anyway,
rather check that the commit does not break the usual use-cases.
---
 src/list.c         | 26 ++------------------
 tests/Makefile.am  |  1 +
 tests/numeric.at   | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 tests/testsuite.at |  1 +
 4 files changed, 76 insertions(+), 24 deletions(-)
 create mode 100644 tests/numeric.at

diff --git a/src/list.c b/src/list.c
index 22bec01..298134e 100644
--- a/src/list.c
+++ b/src/list.c
@@ -1217,18 +1217,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]
@@ -1236,18 +1225,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.  */
 
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 70aa874..ff78268 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -148,6 +148,7 @@ TESTSUITE_AT = \
  multiv06.at\
  multiv07.at\
  multiv08.at\
+ numeric.at\
  old.at\
  onetop01.at\
  onetop02.at\
diff --git a/tests/numeric.at b/tests/numeric.at
new file mode 100644
index 0000000..217299b
--- /dev/null
+++ b/tests/numeric.at
@@ -0,0 +1,72 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+#
+# Test suite for GNU tar.
+# Copyright 2015 Free Software Foundation, Inc.
+
+# This file is part of GNU tar.
+
+# 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/>.
+#
+# Test description:
+# Basic test for --numeric-owner option.
+
+AT_SETUP([--numeric-owner basic tests])
+
+AT_KEYWORDS([options numeric-owner])
+
+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
+
+(
+  unset $TA
+  tar -cvvf a dir --numeric-owner
+  tar -cvvf a dir
+  echo --- ---
+  tar -tvvf a --numeric-owner
+  tar -tvvf a
+  echo --- ---
+  tar --diff -vvf a --numeric-owner
+  tar --diff -vvf a
+  echo --- ---
+  tar -xvvf a --numeric-owner
+  tar -xvvf a
+  echo --- ---
+) > stdout.raw
+
+awk '{ print @S|@2 }' < stdout.raw > stdout
+
+for i in 1 2 3 4
+do
+cat >>stdoutexp <<EOF
+$MYUID/$MYGID
+$MYUID/$MYGID
+$MYUSR/$MYGRP
+$MYUSR/$MYGRP
+---
+EOF
+done
+
+diff stdout stdoutexp
+],
+[0],
+[], [], [], [], [posix,gnu,ustar,oldgnu])
+
+AT_CLEANUP
diff --git a/tests/testsuite.at b/tests/testsuite.at
index b1e7d3b..e104695 100644
--- a/tests/testsuite.at
+++ b/tests/testsuite.at
@@ -217,6 +217,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])
-- 
2.5.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]