Skip to content

Commit

Permalink
PoC: Do not export A
Browse files Browse the repository at this point in the history
Instead of passing A as part of the process environment, we pass it
via a file. Since A is usually the greatest contributor to the process
environment, removing it from the process environment significantly
helps running into MAX_ARG_STRLEN when spawning a new child process.

This means that A is now unexported in the ebuild. However, A is
mostly used as part of the default_src_unpack function. And there A
does not need to be exported.

Proof-of-concept for https://bugs.gentoo.org/721088

Bug: https://bugs.gentoo.org/721088
Signed-off-by: Florian Schmaus <[email protected]>
  • Loading branch information
Flowdalic committed Aug 31, 2024
1 parent 747b2d2 commit fc3acfa
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 3 deletions.
9 changes: 7 additions & 2 deletions bin/ebuild.sh
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#!/usr/bin/env bash
# Copyright 1999-2021 Gentoo Authors
# Copyright 1999-2024 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

# Prevent aliases from causing portage to act inappropriately.
Expand All @@ -10,6 +10,11 @@ unalias -a
unset BASH_COMPAT
declare -F ___in_portage_iuse >/dev/null && export -n -f ___in_portage_iuse

if [[ -v PORTAGE_EBUILD_EXTRA_SOURCE ]]; then
source "${PORTAGE_EBUILD_EXTRA_SOURCE}" || exit 1
unset PORTAGE_EBUILD_EXTRA_SOURCE
fi

source "${PORTAGE_BIN_PATH}/isolated-functions.sh" || exit 1

# Set up the bash version compatibility level. This does not disable
Expand Down Expand Up @@ -114,7 +119,7 @@ export PORTAGE_BZIP2_COMMAND=${PORTAGE_BZIP2_COMMAND:-bzip2}

# These two functions wrap sourcing and calling respectively. At present they
# perform a qa check to make sure eclasses and ebuilds and profiles don't mess
# with shell opts (shopts). Ebuilds/eclasses changing shopts should reset them
# with shell opts (shopts). Ebuilds/eclasses changing shopts should reset them
# when they are done.

__qa_source() {
Expand Down
33 changes: 32 additions & 1 deletion lib/portage/package/ebuild/doebuild.py
Original file line number Diff line number Diff line change
Expand Up @@ -2131,9 +2131,40 @@ def spawn(
logname_backup = mysettings.configdict["env"].get("LOGNAME")
mysettings.configdict["env"]["LOGNAME"] = logname

eapi = mysettings["EAPI"]

# TODO: Move into eapi.py
def eapi_does_not_export_a(eapi):
return eapi == "9"

dont_export_a = "dont-export-a" in mysettings.features or eapi_does_not_export_a(
eapi
)

if dont_export_a:
orig_env = mysettings.environ()
# Copy since we are potentially removing keys from the dict.
env = orig_env.copy()

t = env["T"]
if not os.path.isdir(t):
os.makedirs(t)

ebuildExtraSource = os.path.join(t, "portage-ebuild-extra-source")
with open(ebuildExtraSource, mode="w") as f:
for name, value in orig_env.items():
if name != "A":
continue
f.write(f"{name}='{value}'\n")
del env[name]

env["PORTAGE_EBUILD_EXTRA_SOURCE"] = str(ebuildExtraSource)
else:
env = mysettings.environ()

try:
if keywords.get("returnpid") or keywords.get("returnproc"):
return spawn_func(mystring, env=mysettings.environ(), **keywords)
return spawn_func(mystring, env=env, **keywords)

proc = EbuildSpawnProcess(
background=False,
Expand Down

0 comments on commit fc3acfa

Please sign in to comment.