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 Jul 4, 2024
1 parent 918f4a4 commit d9ec4a2
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 2 deletions.
6 changes: 5 additions & 1 deletion 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,10 @@ 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
fi

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

# Set up the bash version compatibility level. This does not disable
Expand Down
30 changes: 29 additions & 1 deletion lib/portage/package/ebuild/doebuild.py
Original file line number Diff line number Diff line change
Expand Up @@ -2131,9 +2131,37 @@ 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 os.path.isdir(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 d9ec4a2

Please sign in to comment.