[Python-checkins] bpo-10496: distutils check_environ() handles getpwuid() error (GH-10931) (GH-11213)

Victor Stinner webhook-mailer at python.org
Tue Dec 18 11:35:01 EST 2018


https://github.com/python/cpython/commit/ea6b322829c62951362f267d7afdd262aa2b3e2c
commit: ea6b322829c62951362f267d7afdd262aa2b3e2c
branch: 2.7
author: Victor Stinner <vstinner at redhat.com>
committer: GitHub <noreply at github.com>
date: 2018-12-18T17:34:51+01:00
summary:

bpo-10496: distutils check_environ() handles getpwuid() error (GH-10931) (GH-11213)

check_environ() of distutils.utils now catchs KeyError on calling
pwd.getpwuid(): don't create the HOME environment variable in this
case.

(cherry picked from commit 17d0c0595e101c4ce76b58e55de37e6b5083e6cd)

files:
A Misc/NEWS.d/next/Library/2018-12-05-17-42-49.bpo-10496.laV_IE.rst
M Lib/distutils/tests/test_util.py
M Lib/distutils/util.py

diff --git a/Lib/distutils/tests/test_util.py b/Lib/distutils/tests/test_util.py
index 7898e07b2517..e0817097296d 100644
--- a/Lib/distutils/tests/test_util.py
+++ b/Lib/distutils/tests/test_util.py
@@ -1,11 +1,14 @@
 """Tests for distutils.util."""
+import os
 import sys
 import unittest
-from test.test_support import run_unittest
+from test.test_support import run_unittest, swap_attr
 
 from distutils.errors import DistutilsByteCompileError
 from distutils.tests import support
-from distutils.util import byte_compile, grok_environment_error
+from distutils import util # used to patch _environ_checked
+from distutils.util import (byte_compile, grok_environment_error,
+                            check_environ, get_platform)
 
 
 class UtilTestCase(support.EnvironGuard, unittest.TestCase):
@@ -26,6 +29,41 @@ def test_grok_environment_error(self):
         msg = grok_environment_error(exc)
         self.assertEqual(msg, "error: Unable to find batch file")
 
+    def test_check_environ(self):
+        util._environ_checked = 0
+        os.environ.pop('HOME', None)
+
+        check_environ()
+
+        self.assertEqual(os.environ['PLAT'], get_platform())
+        self.assertEqual(util._environ_checked, 1)
+
+    @unittest.skipUnless(os.name == 'posix', 'specific to posix')
+    def test_check_environ_getpwuid(self):
+        util._environ_checked = 0
+        os.environ.pop('HOME', None)
+
+        import pwd
+
+        # only set pw_dir field, other fields are not used
+        def mock_getpwuid(uid):
+            return pwd.struct_passwd((None, None, None, None, None,
+                                      '/home/distutils', None))
+
+        with swap_attr(pwd, 'getpwuid', mock_getpwuid):
+            check_environ()
+            self.assertEqual(os.environ['HOME'], '/home/distutils')
+
+        util._environ_checked = 0
+        os.environ.pop('HOME', None)
+
+        # bpo-10496: Catch pwd.getpwuid() error
+        def getpwuid_err(uid):
+            raise KeyError
+        with swap_attr(pwd, 'getpwuid', getpwuid_err):
+            check_environ()
+            self.assertNotIn('HOME', os.environ)
+
 
 def test_suite():
     return unittest.makeSuite(UtilTestCase)
diff --git a/Lib/distutils/util.py b/Lib/distutils/util.py
index 2b4d7849bdcc..5a06b8597c6e 100644
--- a/Lib/distutils/util.py
+++ b/Lib/distutils/util.py
@@ -178,8 +178,13 @@ def check_environ ():
         return
 
     if os.name == 'posix' and 'HOME' not in os.environ:
-        import pwd
-        os.environ['HOME'] = pwd.getpwuid(os.getuid())[5]
+        try:
+            import pwd
+            os.environ['HOME'] = pwd.getpwuid(os.getuid())[5]
+        except (ImportError, KeyError):
+            # bpo-10496: if the current user identifier doesn't exist in the
+            # password database, do nothing
+            pass
 
     if 'PLAT' not in os.environ:
         os.environ['PLAT'] = get_platform()
diff --git a/Misc/NEWS.d/next/Library/2018-12-05-17-42-49.bpo-10496.laV_IE.rst b/Misc/NEWS.d/next/Library/2018-12-05-17-42-49.bpo-10496.laV_IE.rst
new file mode 100644
index 000000000000..cbfe5eb11668
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2018-12-05-17-42-49.bpo-10496.laV_IE.rst
@@ -0,0 +1,3 @@
+:func:`~distutils.utils.check_environ` of :mod:`distutils.utils` now catchs
+:exc:`KeyError` on calling :func:`pwd.getpwuid`: don't create the ``HOME``
+environment variable in this case.



More information about the Python-checkins mailing list