sys-apps/portage: fix crashes in latest releases

- in unpacking distfiles app-alternatives/tar[libarchive] is a
  defensible choice as a system default, but portage wrongly assumed
  `tar` is `gtar`.

- a coding error in binhost support crashed at startup

Sam has asked me to make the changes directly, as his power is cutting
out.

Signed-off-by: Eli Schwartz <eschwartz@gentoo.org>
This commit is contained in:
Eli Schwartz 2025-09-15 11:55:38 -04:00
parent 68e8d81cb3
commit eab8229382
No known key found for this signature in database
GPG Key ID: 84A7D12B700D2F57
3 changed files with 331 additions and 0 deletions

View File

@ -0,0 +1,57 @@
From 479f0daedc332ad2be8973f3ecd176cb78beb9f4 Mon Sep 17 00:00:00 2001
From: Eli Schwartz <eschwartz@gentoo.org>
Date: Mon, 15 Sep 2025 11:38:52 -0400
Subject: [PATCH] ensure GNU tar is used in most places
Portage makes certain assumptions in various places, such as --xattrs
enabling FEATURES=xattr and its lack *unconditionally* disabling it. Or,
--wildcard existing.
PMS mandates "GNU Tar" be used to extract files in `unpack`, and a
recent fix went "all in" and used GNU Tar options to improve the
function.
All this is quite reasonable, but nowhere have we ever enforced that
"gtar" is used. libarchive is a valid app-alternatives/tar, on Gentoo,
has been broken subtly in the past, and now breaks src_unpack.
emerge-webrsync alone has "is_gnu" support code introduced since commit
23ce89c761c080e7d3163165dded94241a9a9eea, so leave it alone.
Fixes: 3e89139fae34c9bd2e2b4c0490512f71d1d78546
Signed-off-by: Eli Schwartz <eschwartz@gentoo.org>
---
diffstat limited to 3.0.69.1 regression fix only
bin/phase-helpers.sh | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/bin/phase-helpers.sh b/bin/phase-helpers.sh
index 02b1aea4e..47c6f8167 100644
--- a/bin/phase-helpers.sh
+++ b/bin/phase-helpers.sh
@@ -480,17 +480,17 @@ unpack() {
unrar x -idq -o+ "${srcdir}${f}"
;;
tar.bz|tar.bz2|tbz|tbz2)
- tar -I "${bzip2_cmd-bzip2} -c" -xof "${srcdir}${f}"
+ gtar -I "${bzip2_cmd-bzip2} -c" -xof "${srcdir}${f}"
;;
tar|tar.*|tgz)
# GNU tar recognises various file suffixes, for
# which it is able to execute the appropriate
# decompressor. They are documented by the
# (info) manual for the -a option.
- tar --warning=decompress-program -xof "${srcdir}${f}"
+ gtar --warning=decompress-program -xof "${srcdir}${f}"
;;
txz)
- tar -xJof "${srcdir}${f}"
+ gtar -xJof "${srcdir}${f}"
;;
xz)
xz -dc -- "${srcdir}${f}" > "${basename%.*}"
--
2.49.1

View File

@ -0,0 +1,37 @@
From 05b422928735492d0448fbcb6b56f03aadc53eef Mon Sep 17 00:00:00 2001
From: Eli Schwartz <eschwartz@gentoo.org>
Date: Mon, 15 Sep 2025 12:10:18 -0400
Subject: [PATCH] fix crash when using binhost due to using conditionally
defined variable
extra_info didn't always exist, so if you get http 304 but no
Last-Modified, portage errors out with:
```
File "/usr/lib/python3.13/site-packages/portage/dbapi/bintree.py", line 1519, in _populate_remote
"up-to-date", extra_info
^^^^^^^^^^
UnboundLocalError: cannot access local variable 'extra_info' where it is not associated with a value
```
Fixes: c83466a50efdee2cac81a5ed6a660c11b9ac746e
Signed-off-by: Eli Schwartz <eschwartz@gentoo.org>
---
lib/portage/dbapi/bintree.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/lib/portage/dbapi/bintree.py b/lib/portage/dbapi/bintree.py
index f88d5e0aa..ebd0ec08c 100644
--- a/lib/portage/dbapi/bintree.py
+++ b/lib/portage/dbapi/bintree.py
@@ -1506,6 +1506,7 @@ class binarytree:
if (
hasattr(err, "code") and err.code == 304
): # not modified (since local_timestamp)
+ extra_info = ""
if hasattr(err, "headers") and err.headers.get(
"Last-Modified", ""
):
--
2.49.1

View File

@ -0,0 +1,237 @@
# Copyright 1999-2025 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
# py3.14: bug #957070
PYTHON_COMPAT=( pypy3_11 python3_{11..13} )
PYTHON_REQ_USE='bzip2(+),threads(+)'
TMPFILES_OPTIONAL=1
inherit meson linux-info python-r1 tmpfiles
DESCRIPTION="The package management and distribution system for Gentoo"
HOMEPAGE="https://wiki.gentoo.org/wiki/Project:Portage"
if [[ ${PV} == 9999 ]] ; then
EGIT_REPO_URI="
https://anongit.gentoo.org/git/proj/portage.git
https://github.com/gentoo/portage.git
"
inherit git-r3
else
SRC_URI="https://gitweb-cdn-origin.gentoo.org/proj/portage.git/snapshot/${P}.tar.bz2"
KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~loong ~m68k ~mips ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86"
fi
LICENSE="GPL-2"
SLOT="0"
IUSE="apidoc build doc gentoo-dev +ipc +native-extensions +rsync-verify selinux test xattr"
REQUIRED_USE="${PYTHON_REQUIRED_USE}"
RESTRICT="!test? ( test )"
BDEPEND="
${PYTHON_DEPS}
>=app-arch/tar-1.27
>=dev-build/meson-1.3.0-r1
>=sys-apps/sed-4.0.5
sys-devel/patch
!build? ( $(python_gen_impl_dep 'ssl(+)') )
apidoc? (
dev-python/sphinx[${PYTHON_USEDEP}]
dev-python/sphinx-epytext[${PYTHON_USEDEP}]
)
doc? (
~app-text/docbook-xml-dtd-4.4
app-text/xmlto
)
test? (
dev-python/pytest-xdist[${PYTHON_USEDEP}]
dev-vcs/git
)
"
# Require sandbox-2.2 for bug #288863.
# For whirlpool hash, require python[ssl] (bug #425046).
RDEPEND="
${PYTHON_DEPS}
acct-user/portage
>=app-arch/tar-1.27
app-arch/zstd
>=app-misc/pax-utils-0.1.17
dev-lang/python-exec:2
>=sys-apps/baselayout-2.9
>=sys-apps/findutils-4.9
!build? (
>=app-admin/eselect-1.2
app-portage/getuto
>=app-shells/bash-5.0:0
>=sec-keys/openpgp-keys-gentoo-release-20240703
>=sys-apps/sed-4.0.5
rsync-verify? (
>=app-crypt/gnupg-2.2.4-r2[ssl(-)]
>=app-portage/gemato-14.5[${PYTHON_USEDEP}]
)
)
elibc_glibc? ( >=sys-apps/sandbox-2.2 )
elibc_musl? ( >=sys-apps/sandbox-2.2 )
kernel_linux? ( sys-apps/util-linux )
selinux? ( >=sys-libs/libselinux-2.0.94[python,${PYTHON_USEDEP}] )
xattr? ( kernel_linux? (
>=sys-apps/install-xattr-0.3
) )
"
# coreutils-6.4 rdep is for date format in emerge-webrsync #164532
# NOTE: FEATURES=installsources requires debugedit and rsync
PDEPEND="
!build? (
>=net-misc/rsync-2.6.4
>=sys-apps/coreutils-6.4
>=sys-apps/file-5.44-r3
)
"
PATCHES=(
"${FILESDIR}"/${P}-gtar.patch
"${FILESDIR}"/${P}-unbound.patch
)
pkg_pretend() {
local CONFIG_CHECK="~IPC_NS ~PID_NS ~NET_NS ~UTS_NS"
check_extra_config
}
src_prepare() {
default
if use prefix-guest; then
sed -e "s|^\(main-repo = \).*|\\1gentoo_prefix|" \
-e "s|^\\[gentoo\\]|[gentoo_prefix]|" \
-e "s|^\(sync-uri = \).*|\\1rsync://rsync.prefix.bitzolder.nl/gentoo-portage-prefix|" \
-i cnf/repos.conf || die "sed failed"
fi
}
src_configure() {
local code_only=false
python_foreach_impl my_src_configure
}
my_src_configure() {
local emesonargs=(
-Dcode-only=${code_only}
-Deprefix="${EPREFIX}"
-Dportage-bindir="${EPREFIX}/usr/lib/portage/${EPYTHON}"
-Ddocdir="${EPREFIX}/usr/share/doc/${PF}"
$(meson_use doc)
$(meson_use apidoc)
$(meson_use gentoo-dev)
$(meson_use ipc)
$(meson_use xattr)
)
if use native-extensions && [[ "${EPYTHON}" != pypy3* ]] ; then
emesonargs+=( -Dnative-extensions=true )
else
emesonargs+=( -Dnative-extensions=false )
fi
if use build; then
emesonargs+=( -Drsync-verify=false )
else
emesonargs+=( $(meson_use rsync-verify) )
fi
meson_src_configure
code_only=true
}
src_compile() {
python_foreach_impl meson_src_compile
}
src_test() {
local EPYTEST_XDIST=1
local -x PYTEST_DISABLE_PLUGIN_AUTOLOAD=1
python_foreach_impl epytest
}
src_install() {
python_foreach_impl my_src_install
dotmpfiles "${FILESDIR}"/portage-{ccache,tmpdir}.conf
local scripts
mapfile -t scripts < <(awk '/^#!.*python/ {print FILENAME} {nextfile}' "${ED}"/usr/{bin,sbin}/* || die)
python_replicate_script "${scripts[@]}"
}
my_src_install() {
local pydirs=(
"${D}$(python_get_sitedir)"
"${ED}/usr/lib/portage/${EPYTHON}"
)
meson_src_install
python_fix_shebang "${pydirs[@]}"
python_optimize "${pydirs[@]}"
}
pkg_preinst() {
if ! use build && [[ -z ${ROOT} ]]; then
python_setup
local sitedir=$(python_get_sitedir)
[[ -d ${D}${sitedir} ]] || die "${D}${sitedir}: No such directory"
env -u DISTDIR \
-u PORTAGE_OVERRIDE_EPREFIX \
-u PORTAGE_REPOSITORIES \
-u PORTDIR \
-u PORTDIR_OVERLAY \
PYTHONPATH="${D}${sitedir}${PYTHONPATH:+:${PYTHONPATH}}" \
ED="${ED}" \
"${PYTHON}" -m portage._compat_upgrade.default_locations || die
env -u BINPKG_COMPRESS -u PORTAGE_REPOSITORIES \
PYTHONPATH="${D}${sitedir}${PYTHONPATH:+:${PYTHONPATH}}" \
ED="${ED}" \
"${PYTHON}" -m portage._compat_upgrade.binpkg_compression || die
env -u FEATURES -u PORTAGE_REPOSITORIES \
PYTHONPATH="${D}${sitedir}${PYTHONPATH:+:${PYTHONPATH}}" \
ED="${ED}" \
"${PYTHON}" -m portage._compat_upgrade.binpkg_multi_instance || die
env -u BINPKG_FORMAT \
PYTHONPATH="${D}${sitedir}${PYTHONPATH:+:${PYTHONPATH}}" \
ED="${ED}" \
"${PYTHON}" -m portage._compat_upgrade.binpkg_format || die
fi
# elog dir must exist to avoid logrotate error for bug #415911.
# This code runs in preinst in order to bypass the mapping of
# portage:portage to root:root which happens after src_install.
keepdir /var/log/portage/elog
# This is allowed to fail if the user/group are invalid for prefix users.
if chown portage:portage "${ED}"/var/log/portage{,/elog} 2>/dev/null ; then
chmod g+s,ug+rwx "${ED}"/var/log/portage{,/elog}
fi
if has_version "<${CATEGORY}/${PN}-2.3.77"; then
elog "The emerge --autounmask option is now disabled by default, except for"
elog "portions of behavior which are controlled by the --autounmask-use and"
elog "--autounmask-license options. For backward compatibility, previous"
elog "behavior of --autounmask=y and --autounmask=n is entirely preserved."
elog "Users can get the old behavior simply by adding --autounmask to the"
elog "make.conf EMERGE_DEFAULT_OPTS variable. For the rationale for this"
elog "change, see https://bugs.gentoo.org/658648."
fi
}
pkg_postinst() {
# Warn about obsolete "enotice" script, bug #867010
local bashrc=${EROOT}/etc/portage/profile/profile.bashrc
if [[ -e ${bashrc} ]] && grep -q enotice "${bashrc}"; then
eerror "Obsolete 'enotice' script detected!"
eerror "Please remove this from ${bashrc} to avoid problems."
eerror "See bug 867010 for more details."
fi
}