Tar and very old dates

Denys Vlasenko vda.linux at googlemail.com
Wed Jul 8 14:48:49 UTC 2009


On Wed, Jul 8, 2009 at 11:11 AM, T4ndeta<t4ndeta at gmail.com> wrote:
> Hi,
>
> Today I came a cross a strange tar archive which couldn't been
> extracted by tar from busybox (tested on recent snapshot).
> I checked that this archive has files/directories with creation date about 1920.
> Looks like very old dates are stored in different manner then dates above 1970.
>
> Here is what I changed to solve my problem
> file: /archival/libunarchive/get_header_tar.c
> @@ -301,7 +303,9 @@
>        file_header->uname = tar.uname[0] ? xstrndup(tar.uname,
> sizeof(tar.uname)) : NULL;
>        file_header->gname = tar.gname[0] ? xstrndup(tar.gname,
> sizeof(tar.gname)) : NULL;
>  #endif
> -       file_header->mtime = GET_OCTAL(tar.mtime);
> +       file_header->mtime = *tar.mtime == 0xFF /* positive base256? */

No, 0xFF (and any byte of the form 11xxxxxx) is _negative_ base256.
And therefore:

> +                       ? getBase256_len12(tar.mtime)

this is wrong: see a comment at getBase256_len12 - it does not handle
negative numbers, and also it expects a specific alignment.

> +                       : GET_OCTAL(tar.mtime);
>        /* Size field: handle GNU tar's "base256 encoding" */
>        file_header->size = (*tar.size & 0xc0) == 0x80 /* positive base256? */
>                        ? getBase256_len12(tar.size)
>
> Don't know if the condition is good for all situation, but it did work
> in my case

On x86, which does not have alignment faults, yes.


How about this?

        /* mtime: rudimentally handle GNU tar's "base256 encoding"
         * People report tarballs with NEGATIVE unix times encoded that way */
        file_header->mtime = (tar.mtime[0] & 0x80) /* base256? */
                        ? 0 /* bogus */
                        : GET_OCTAL(tar.mtime);
        /* size: handle GNU tar's "base256 encoding" */
        file_header->size = (tar.size[0] & 0xc0) == 0x80 /* positive base256? */
                        ? getBase256_len12(tar.size)
                        : GET_OCTAL(tar.size);

--
vda


More information about the busybox mailing list