commit:     12706b32b34923c4a44df61d3b810bb9908208f5
Author:     Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Mon Nov 10 05:01:38 2025 +0000
Commit:     Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Mon Nov 10 05:32:25 2025 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=12706b32

cache/metadata: use tempfile module for pid namespace safety

This is the old PMS cache format which is not really used anymore
except in PortdbCacheTestCase.

Bug: https://bugs.gentoo.org/851015
Signed-off-by: Zac Medico <zmedico <AT> gentoo.org>

 lib/portage/cache/metadata.py | 29 +++++++++++++++++++----------
 1 file changed, 19 insertions(+), 10 deletions(-)

diff --git a/lib/portage/cache/metadata.py b/lib/portage/cache/metadata.py
index 791ad8344e..40630e0b8a 100644
--- a/lib/portage/cache/metadata.py
+++ b/lib/portage/cache/metadata.py
@@ -1,10 +1,11 @@
-# Copyright 2005-2021 Gentoo Authors
+# Copyright 2005-2025 Gentoo Authors
 # Author(s): Brian Harring ([email protected])
 # License: GPL2
 
 import errno
 import re
 import stat
+import tempfile
 from operator import attrgetter
 
 import portage
@@ -149,21 +150,29 @@ class database(flat_hash.database):
                     )
 
         s = cpv.rfind("/")
-        fp = os.path.join(
-            self.location, cpv[:s], ".update.%i.%s" % (portage.getpid(), cpv[s 
+ 1 :])
+        tempfile_kwargs = dict(
+            prefix=_unicode_encode(
+                f".update.{portage.getpid()}.{cpv[s + 1:]}",
+                encoding=_encodings["fs"],
+                errors="strict",
+            ),
+            dir=_unicode_encode(
+                os.path.join(self.location, cpv[:s]),
+                encoding=_encodings["fs"],
+                errors="strict",
+            ),
+            delete=False,
+            mode="wb",
         )
         try:
-            myf = open(
-                _unicode_encode(fp, encoding=_encodings["fs"], 
errors="strict"), "wb"
-            )
+            myf = tempfile.NamedTemporaryFile(**tempfile_kwargs)
+            fp = myf.name
         except OSError as e:
             if errno.ENOENT == e.errno:
                 try:
                     self._ensure_dirs(cpv)
-                    myf = open(
-                        _unicode_encode(fp, encoding=_encodings["fs"], 
errors="strict"),
-                        "wb",
-                    )
+                    myf = tempfile.NamedTemporaryFile(**tempfile_kwargs)
+                    fp = myf.name
                 except OSError as e:
                     raise cache_errors.CacheCorruption(cpv, e)
             else:

Reply via email to