> +( > + unset $TA > + tar -cvvf a dir --numeric-owner Uh, I fixed the patch for this 'unset' artifact.
Pavel
>From cf298b1d989ac7055cf219a2eda07de2cae992f0 Mon Sep 17 00:00:00 2001 From: Pavel Raiskup <prais...@redhat.com> Date: Tue, 29 Sep 2015 07:15:40 +0200 Subject: [PATCH] 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 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 | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/testsuite.at | 1 + 4 files changed, 75 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..ba8d0af --- /dev/null +++ b/tests/numeric.at @@ -0,0 +1,71 @@ +# 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 + +( + 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