Describe the bug
rpmuncompress -x -C <dst> incorrectly detects some valid single-root source archives as not having a single top-level directory.
The problem is in singleRoot(): it reads the first archive entry and assumes that a single-root archive must have a / in that entry's pathname. If the first entry is a top-level directory stored as foo instead of foo/, the function returns NULL, and doUntar() does not apply --strip-components=1.
As a result, archives can be extracted with an extra directory level.
A concrete example is Devel-CallChecker-0.009.tar.gz, whose first entry is stored as:
instead of:
This causes rpmuncompress to treat it differently from archives such as IO-String-1.08.tar.gz, where the first entry is explicitly stored with a trailing slash.
To Reproduce
In our OBS.
https://pickaxe.oerv.ac.cn/package/live_build_log/home:yyjeqhc/perl-Devel-CallChecker/x64/x86_64
[ 33s] + pwd
[ 33s] /home/abuild/rpmbuild/BUILD/perl-Devel-CallChecker-0.009-build/perl-Devel-CallChecker-0.009
[ 33s] + perl Build.PL --installdirs=vendor 'optimize=-O2 -g -fno-omit-frame-pointer -pipe -flto=auto -ffat-lto-objects -funwind-tables -fasynchronous-unwind-tables -fstack-protector-strong -D_FORTIFY_SOURCE=3 -fstack-clash-protection -Wformat -Werror=format-security'
[ 33s] Can't open perl script "Build.PL": No such file or directory
perl-Devel-CallChecker builds fail.
https://pickaxe.oerv.ac.cn/package/live_build_log/home:yyjeqhc/perl-IO-String/x64/x86_64
perl-IO-String builds successfully.
Expected behavior
Both of the above archives should be recognized as single-root archives.
That is:
a top-level directory entry stored as foo/
and a top-level directory entry stored as foo
should be treated equivalently if the first entry is a directory and all archive members belong to the same top-level directory.
rpmuncompress should strip the top-level directory in both cases when extracting with -x -C .
Output
[ 33s] + /usr/lib/rpm/rpmuncompress -x -C perl-Devel-CallChecker-0.009 /home/abuild/rpmbuild/SOURCES/Devel-CallChecker-0.009.tar.gz
[ 33s] + STATUS=0
[ 33s] + '[' 0 -ne 0 ']'
[ 33s] + cd perl-Devel-CallChecker-0.009
[ 33s] + /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
[ 33s] + RPM_EC=0
[ 33s] ++ jobs -p
[ 33s] + exit 0
[ 33s] Executing(%conf): /usr/bin/bash -e /var/tmp/rpm-tmp.ioaeHZ
[ 33s] + umask 022
[ 33s] + cd /home/abuild/rpmbuild/BUILD/perl-Devel-CallChecker-0.009-build
[ 33s] + cd perl-Devel-CallChecker-0.009
[ 33s] + RPM_EC=0
[ 33s] ++ jobs -p
[ 33s] + exit 0
[ 33s] Executing(%build): /usr/bin/bash -e /var/tmp/rpm-tmp.mfgNB1
[ 33s] + umask 022
[ 33s] + cd /home/abuild/rpmbuild/BUILD/perl-Devel-CallChecker-0.009-build
[ 33s] + cd perl-Devel-CallChecker-0.009
[ 33s] + pwd
[ 33s] /home/abuild/rpmbuild/BUILD/perl-Devel-CallChecker-0.009-build/perl-Devel-CallChecker-0.009
[ 33s] + perl Build.PL --installdirs=vendor 'optimize=-O2 -g -fno-omit-frame-pointer -pipe -flto=auto -ffat-lto-objects -funwind-tables -fasynchronous-unwind-tables -fstack-protector-strong -D_FORTIFY_SOURCE=3 -fstack-clash-protection -Wformat -Werror=format-security'
[ 33s] Can't open perl script "Build.PL": No such file or directory
[ 33s] error: Bad exit status from /var/tmp/rpm-tmp.mfgNB1 (%build)
Environment
- OS / Distribution: openRuyi
- Version rpm-4.20.0
Additional context
We are adding Perl buildsystem support. While testing the two packages, we found that the only relevant difference between them is whether the root archive entry is stored with a trailing slash (/) or not.
Describe the bug
rpmuncompress -x -C <dst>incorrectly detects some valid single-root source archives as not having a single top-level directory.The problem is in
singleRoot(): it reads the first archive entry and assumes that a single-root archive must have a/in that entry's pathname. If the first entry is a top-level directory stored asfooinstead offoo/, the function returnsNULL, anddoUntar()does not apply--strip-components=1.As a result, archives can be extracted with an extra directory level.
A concrete example is
Devel-CallChecker-0.009.tar.gz, whose first entry is stored as:instead of:
This causes rpmuncompress to treat it differently from archives such as IO-String-1.08.tar.gz, where the first entry is explicitly stored with a trailing slash.
To Reproduce
In our OBS.
https://pickaxe.oerv.ac.cn/package/live_build_log/home:yyjeqhc/perl-Devel-CallChecker/x64/x86_64
perl-Devel-CallChecker builds fail.
https://pickaxe.oerv.ac.cn/package/live_build_log/home:yyjeqhc/perl-IO-String/x64/x86_64
perl-IO-String builds successfully.
Expected behavior
Both of the above archives should be recognized as single-root archives.
That is:
a top-level directory entry stored as foo/
and a top-level directory entry stored as foo
should be treated equivalently if the first entry is a directory and all archive members belong to the same top-level directory.
rpmuncompress should strip the top-level directory in both cases when extracting with -x -C .
Output
Environment
Additional context
We are adding Perl buildsystem support. While testing the two packages, we found that the only relevant difference between them is whether the root archive entry is stored with a trailing slash (
/) or not.