Commit ea6b3228 authored by Victor Stinner's avatar Victor Stinner Committed by GitHub

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 17d0c059)
parent 34b7c438
"""Tests for distutils.util.""" """Tests for distutils.util."""
import os
import sys import sys
import unittest 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.errors import DistutilsByteCompileError
from distutils.tests import support 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): class UtilTestCase(support.EnvironGuard, unittest.TestCase):
...@@ -26,6 +29,41 @@ class UtilTestCase(support.EnvironGuard, unittest.TestCase): ...@@ -26,6 +29,41 @@ class UtilTestCase(support.EnvironGuard, unittest.TestCase):
msg = grok_environment_error(exc) msg = grok_environment_error(exc)
self.assertEqual(msg, "error: Unable to find batch file") 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(): def test_suite():
return unittest.makeSuite(UtilTestCase) return unittest.makeSuite(UtilTestCase)
......
...@@ -178,8 +178,13 @@ def check_environ (): ...@@ -178,8 +178,13 @@ def check_environ ():
return return
if os.name == 'posix' and 'HOME' not in os.environ: if os.name == 'posix' and 'HOME' not in os.environ:
import pwd try:
os.environ['HOME'] = pwd.getpwuid(os.getuid())[5] 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: if 'PLAT' not in os.environ:
os.environ['PLAT'] = get_platform() os.environ['PLAT'] = get_platform()
......
: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.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment