From: Pavel Raiskup Date: Sun, 6 Dec 2015 19:18:51 +0000 (+0200) Subject: numeric-owner: print big UID/GID correctly X-Git-Tag: release_1_29~32 X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=68e9ab4966770a1766808fabb7483ff1e7dfbaee;p=debian%2Ftar 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. --- diff --git a/src/list.c b/src/list.c index 79f04c0f..70e3375b 100644 --- a/src/list.c +++ b/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. */ diff --git a/tests/Makefile.am b/tests/Makefile.am index 6093d447..3b86ee0a 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -151,6 +151,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 00000000..a5878476 --- /dev/null +++ b/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 . + +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]) + diff --git a/tests/testsuite.at b/tests/testsuite.at index df8c14cb..7c6697f9 100644 --- a/tests/testsuite.at +++ b/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]) +