Subject: Re: bug#13588: Pax hangs in case big UID

From: Petr Hracek <[email-masked]>
Date: Tue, 23 Apr 2013 17:04:36 +0200

Hello Stefano,

I was a little bit busy.

 From my point of view user is not informed that his UID is too big. I 
think that it should be mentioned and visible directly on the screen.
But as I mentioned it is my point of view.

Here are results:
test@kiasportyw: ~/mycproject$ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking how to create a ustar tar archive... none
checking for style of include used by make... GNU
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking dependency style of gcc... gcc3
checking for pthread_create in -lpthread... yes
checking for pthread_join in -lpthread... yes
checking for gcc... (cached) gcc
checking whether we are using the GNU C compiler... (cached) yes
checking whether gcc accepts -g... (cached) yes
checking for gcc option to accept ISO C89... (cached) none needed
checking dependency style of gcc... (cached) gcc3
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: executing depfiles commands
test@kiasportyw: ~/mycproject$

and in config.log file is mentioned:
tar (GNU tar) 1.26
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
<http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by John Gilmore and Jay Fenlason.
configure:2360: $? = 0
configure:2400: tardir=conftest.dir && eval tar --format=ustar -chf - 
"$tardir" >conftest.tar
tar: value 17000000 out of uid_t range 0..2097151
tar: Exiting with failure status due to previous errors
configure:2403: $? = 2
configure:2400: tardir=conftest.dir && eval pax -L -x ustar -w "$tardir" 
 >conftest.tar
pax: Ustar header field is too small for conftest.dir
pax: Ustar header field is too small for conftest.dir/file
configure:2403: $? = 1
configure: 2421: UID '17000000' too large for ustar
configure:2400: tardir=conftest.dir && eval find "$tardir" -print | cpio 
-o -H ustar -L >conftest.tar
5 blocks
configure:2403: $? = 0
configure:2400: tardir=conftest.dir && eval false >conftest.tar
configure:2403: $? = 1
configure:2443: result: none
configure:2463: checking for style of include used by make
configure:2491: result: GNU
configure:2562: checking for gcc
configure:2578: found /usr/bin/gcc
configure:2589: result: gcc
configure:2818: checking for C compiler version
configure:2827: gcc --version >&5

Best regards
Petr
On 04/23/2013 10:45 AM, Stefano Lattarini wrote:
> On 04/22/2013 03:55 PM, Stefano Lattarini wrote:
>> Hi Peter, thanks for the feedback.
>>
>> On 04/22/2013 03:21 PM, Petr Hracek wrote:
>>> Hello Stefano,
>>>
>>> thanks for the patch. All is working properly.
>>> User is informed that UID is not enough smaller and configure script does not failed.
>>>
>> Good to know the logic is sound.  However, I now notice that there
>> is still a problem with the output of configure :-/  (details below).
>>
>>> Result is below:
>>> test@localhost: ~/mycproject$ id
>>> uid=17000000(test) gid=1001(test) groups=1001(test) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
>>> test@localhost: ~/mycproject$ ./configure
>>> checking for a BSD-compatible install... /usr/bin/install -c
>>> checking whether build environment is sane... yes
>>> checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
>>> checking for gawk... gawk
>>> checking whether make sets $(MAKE)... yes
>>> checking how to create a ustar tar archive... checking whether UID '17000000' is small enough for ustar... no
>>> none
>>>
>> Oops, there are two messages are crossing.  This is bad.
>> I think the best solution at this point is simply to report the too-high UID
>> only in the generated config.log rather than in the console output.  Updated
>> patch coming up soonish (I hope)...
>>
> Here it is.  I'd appreciate further testing, if possible.
>
> Thanks,
>    Stefano
>
> ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ----
>
>  From bfb877d2337acfe3af1ef0d6e405f834a9287a37 Mon Sep 17 00:00:00 2001
> Message-Id: <bfb877d23[email-masked]>
> From: Stefano Lattarini <[email-masked]>
> Date: Sun, 17 Feb 2013 16:42:46 +0100
> Subject: [PATCH] tar: pax could hang configure when big UID are involved
>
> See automake bug#8343 and bug#13588.
>
> Tom Rini [email-masked] says (in bug#8343):
>
>      When the user has a UID or GID that is larger than the ustar format
>      supports, pax does not error out gracefully in some cases (FC13).
>
> Marc Herbert <[email-masked]> adds (in bug#8343):
>
>      When "configure" is run by a user with an UID bigger than 21 bits,
>      BSD pax 3.4 aborts when trying to create the 'conftest.tar' test
>      archive and leaves an empty or corrupted conftest.tar file behind.
>      In the next step, pax tries to extract this incomplete or corrupted
>      archive and this *** hangs the whole ./configure script ***.
>
>      Note: GNU cpio 2.9 pretends to pass the test but it is a LIE: it
>      silently truncates any big UID to its lower 21 bits. I don't know
>      what can be the consequences of this lie.
>
> Months later, Petr Hracek <[email-masked]> reports a similar issue
> (in bug#13588) for Fedora 17:
>
>      I am trying to solve problem in case a user is created with big
>      UID and during configuration pax hangs with message
>
>          ATTENTION! pax archive volume change required.
>          Ready for archive volume: 1
>          Input archive name or "." to quit pax.
>          Archive name >
>
>      and needs user interaction.
>
>      Reference: <https://bugzilla.redhat.com/show_bug.cgi?id=843376>
>
> Time to fix this issue, on the line of a preliminary patch provided by
> Petr Hracek in bug#13588.
>
> * m4/tar.m4 (_AM_PROG_TAR): Don't use 'pax' if the UID or GID of the
> current user is too high (> 2097151).
> * NEWS: Update.
> * THANKS: Likewise.
>
> Signed-off-by: Stefano Lattarini <[email-masked]>
> ---
>   NEWS      |  6 ++++++
>   THANKS    |  3 +++
>   m4/tar.m4 | 26 +++++++++++++++++++++++++-
>   3 files changed, 34 insertions(+), 1 deletion(-)
>
> diff --git a/NEWS b/NEWS
> index f9a1fb1..863ffdf 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -78,6 +78,12 @@ New in 1.13.2:
>
>   * Bugs fixed:
>
> +  - When the 'ustar' option is used, the generated configure script no
> +    longer risks hanging during the tests for the availability of the
> +    'pax' utility, even if the user running configure has a UID or GID
> +    that requires more than 21 bits to be represented.
> +    See automake bug#8343 and bug#13588.
> +
>     - The obsolete macros AM_CONFIG_HEADER or AM_PROG_CC_STDC work once
>       again, as they did in Automake 1.12.x (albeit printing runtime
>       warnings in the 'obsolete' category).  Removing them has turned
> diff --git a/THANKS b/THANKS
> index 66498d4..a574909 100644
> --- a/THANKS
> +++ b/THANKS
> @@ -224,6 +224,7 @@ Luo Yi                          [email-masked]
>   Maciej Stachowiak               [email-masked]
>   Maciej W. Rozycki               [email-masked]
>   Manu Rouat                      [email-masked]
> +Marc Herbert                    [email-masked]
>   Marcus Brinkmann                [email-masked]
>   Marcus G. Daniels               [email-masked]
>   Marius Vollmer                  [email-masked]
> @@ -311,6 +312,7 @@ Peter Muir                      [email-masked]
>   Peter O'Gorman                  [email-masked]
>   Peter Rosin                     [email-masked]
>   Peter Seiderer                  [email-masked]
> +Petr Hracek                     [email-masked]
>   Petter Reinholdtsen             [email-masked]
>   Petteri Räty                    [email-masked]
>   Phil Edwards                    [email-masked]
> @@ -391,6 +393,7 @@ Tim Rice                        [email-masked]
>   Tim Van Holder                  [email-masked]
>   Toshio Kuratomi                 [email-masked]
>   Tom Epperly                     [email-masked]
> +Tom Rini                        [email-masked]
>   Ulrich Drepper                  [email-masked]
>   Ulrich Eckhardt                 [email-masked]
>   Václav Haisman                  [email-masked]
> diff --git a/m4/tar.m4 b/m4/tar.m4
> index ec8c83e..61c1206 100644
> --- a/m4/tar.m4
> +++ b/m4/tar.m4
> @@ -81,7 +81,31 @@ do
>     AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
>     rm -rf conftest.dir
>     if test -s conftest.tar; then
> -    AM_RUN_LOG([$am__untar <conftest.tar])
> +    m4_if([$1], [ustar], [
> +      if test "$_am_tool" = pax; then
> +        # Automake bugs #8343 and #13588: 'pax' can hang when UIDs
> +        # or GIDs are involved that requires more than 21 bits to
> +        # be stored.
> +        am_max_uid=2097151 # 2^21 - 1
> +        am_max_gid=$am_max_uid
> +        # The $UID and $GID variables are not portable, so we need to
> +        # resort to the POSIX-mandated id(1) utility.  Errors here are
> +        # definitely unexpected, so allow the users to see them (i.e.,
> +        # no stderr redirection).
> +        am_uid=`id -u || echo unknown`
> +        am_gid=`id -g || echo unknown`
> +        if test $am_uid -le $am_max_uid; then :; else
> +          AS_ECHO(["$as_me:$LINENO: UID '$am_uid' too large for ustar"]) \
> +            >&AS_MESSAGE_LOG_FD
> +          continue
> +        fi
> +        if test $am_gid -le $am_max_gid; then :; else
> +          AS_ECHO(["$as_me:$LINENO: GID '$am_gid' too large for ustar"]) \
> +            >&AS_MESSAGE_LOG_FD
> +          continue
> +        fi
> +      fi
> +    ]) # $1 == ustar
>       grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
>     fi
>   done

-- 
Best regards / S pozdravem Petr Hracek