Antonio Teixeira <[email protected]> writes:

> I believe I've found a possible regression in tar (built from current
> master branch) when extracting certain archives containing hard links
> generated by rpm2archive.
>
> Steps to reproduce:
> First, download an RPM package containing hard links. I've used the
> following RPM from openSUSE Tumbleweed as an example:
> https://download.opensuse.org/tumbleweed/repo/oss/x86_64/389-ds-3.1.4+e2562f589-2.1.x86_64.rpm
>
> Then:
> $ rpm2archive 389-ds-3.1.4+e2562f589-2.1.x86_64.rpm > 389-ds.tar.gz
> $ tar -xvf 389-ds.tar.gz
>
> Which results in:
> ./etc/dirsrv/
> ./etc/dirsrv/config/
> (...)
> ./usr/share/dirsrv/data/10rfc2307compat.ldif
> ./usr/share/dirsrv/schema/10rfc2307compat.ldif
> ../src/tar: Unexpected EOF in archive
> ../src/tar: Error is not recoverable: exiting now
>
> As far as I can tell this was caused by commit
> b8d8a61b25588caca4efaf9bdd2e3f1a49da77e3
> More specifically, reverting the following changes from the commit
> seems to fix the problem:
>
> diff --git a/src/list.c b/src/list.c
> index d541cf26..8e9caf5c 100644
> --- a/src/list.c
> +++ b/src/list.c
> @@ -423,20 +423,15 @@ read_header (union block **return_block, struct
> tar_stat_info *info,
>        if ((status = tar_checksum (header, false)) != HEADER_SUCCESS)
>         break;
>
> -      /* Good block.  Decode file size and return.  */
> -
> -      if (header->header.typeflag == LNKTYPE)
> -       info->stat.st_size = 0; /* links 0 size on tape */
> -      else
> +      info->stat.st_size = OFF_FROM_HEADER (header->header.size);
> +      if (info->stat.st_size < 0)
>         {
> -         info->stat.st_size = OFF_FROM_HEADER (header->header.size);
> -         if (info->stat.st_size < 0)
> -           {
> -             status = HEADER_FAILURE;
> -             break;
> -           }
> +         status = HEADER_FAILURE;
> +         break;
>         }
>
> Note that I've only been able to reproduce this using RPM packages and
> rpm2archive. It doesn't seem to happen when creating archives with
> hard links using other tools like GNU tar or bsdtar, so I'm not
> completely sure this isn't actually a bug in rpm2archive that the
> recent changes in tar might have exposed. However, bsdtar extracts the
> same archive without errors.

FWIW, I am not able to reproduce on Fedora 44 after building 'tar' from
commit 145a671e8ad0f2443e253ea4cc95b676ed7a2847:

    $ rpm2archive 389-ds-3.1.4+e2562f589-2.1.x86_64.rpm > 389-ds.tar.gz
    $ tar -xvf 389-ds.tar.gz
    [...]
    ./var/lib/dirsrv/
    ./var/log/dirsrv/
    ./usr/share/dirsrv/data/10rfc2307compat.ldif
    ./usr/share/dirsrv/schema/10rfc2307compat.ldif
    $ rpm -qf /bin/rpm2archive 
    rpm-6.0.1-2.fc44.x86_64

Hopefully that information is at least slightly helpful.

Collin

Reply via email to