[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