[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
- [Bug-tar] [PATCH] numeric-owner: print big UID/GID correctly,
Pavel Raiskup <=