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."""
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 @@ class UtilTestCase(support.EnvironGuard, unittest.TestCase):
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)
......
......@@ -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()
......
: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