Make all temp dirs under $PORTAGE_TMPDIR/portage.
authorZac Medico <zmedico@gentoo.org>
Fri, 11 Mar 2011 21:02:31 +0000 (13:02 -0800)
committerZac Medico <zmedico@gentoo.org>
Fri, 11 Mar 2011 21:02:31 +0000 (13:02 -0800)
Before, some temporary directories would be created directly in
$PORTAGE_TMPDIR. Now, all are subdirectories of $PORTAGE_TMPDIR/portage
since it's common for people to assume that this is the case anyway.
With the default PORTAGE_TMPDIR setting of /var/tmp, this allows
/var/tmp to be mounted with the "noexec" option, as long as the
/var/tmp/portage subdirectory is a separate mount (people have already
tended to assume that they can do this, so we're making it a reality
in order to avoid any more bug reports). This will fix bug #346899.

pym/portage/dbapi/vartree.py
pym/portage/package/ebuild/doebuild.py

index 376b382d14e8f7fa237a7bf57abb66a177bff8b8..32b4852bfcbe8cdde05fbdaf636910f014572ed9 100644 (file)
@@ -3865,15 +3865,15 @@ class dblink(object):
                        # so imports won't fail during portage upgrade/downgrade.
                        portage.proxy.lazyimport._preload_portage_submodules()
                        settings = self.settings
-                       base_path_orig = os.path.dirname(settings["PORTAGE_BIN_PATH"])
-                       from tempfile import mkdtemp
-
-                       # Make the temp directory inside PORTAGE_TMPDIR since, unlike
-                       # /tmp, it can't be mounted with the "noexec" option.
-                       base_path_tmp = mkdtemp("", "._portage_reinstall_.",
-                               settings["PORTAGE_TMPDIR"])
-                       from portage.process import atexit_register
-                       atexit_register(shutil.rmtree, base_path_tmp)
+
+                       # Make the temp directory inside $PORTAGE_TMPDIR/portage, since
+                       # it's common for /tmp and /var/tmp to be mounted with the
+                       # "noexec" option (see bug #346899).
+                       build_prefix = os.path.join(settings["PORTAGE_TMPDIR"], "portage")
+                       ensure_dirs(build_prefix)
+                       base_path_tmp = tempfile.mkdtemp(
+                               "", "._portage_reinstall_.", build_prefix)
+                       portage.process.atexit_register(shutil.rmtree, base_path_tmp)
                        dir_perms = 0o755
                        for subdir in "bin", "pym":
                                var_name = "PORTAGE_%s_PATH" % subdir.upper()
index 5272f234cd12bf3447469d95c8ac07c847ebee9c..3d031716026d26ed16e6f8f22f552e8aed92ab16 100644 (file)
@@ -281,9 +281,12 @@ def doebuild_environment(myebuild, mydo, myroot=None, settings=None,
        if portage_bin_path not in mysplit:
                mysettings["PATH"] = portage_bin_path + ":" + mysettings["PATH"]
 
+       # All temporary directories should be subdirectories of
+       # $PORTAGE_TMPDIR/portage, since it's common for /tmp and /var/tmp
+       # to be mounted with the "noexec" option (see bug #346899).
        mysettings["BUILD_PREFIX"] = mysettings["PORTAGE_TMPDIR"]+"/portage"
-       mysettings["PKG_TMPDIR"]   = mysettings["PORTAGE_TMPDIR"]+"/binpkgs"
-       
+       mysettings["PKG_TMPDIR"]   = mysettings["BUILD_PREFIX"]+"/._unmerge_"
+
        # Package {pre,post}inst and {pre,post}rm may overlap, so they must have separate
        # locations in order to prevent interference.
        if mydo in ("unmerge", "prerm", "postrm", "cleanrm"):