[3.6] bpo-31471: Fix assertion failure in subprocess.Popen() on Windows, in case env has a bad keys() method. (GH-3580) (#3584)

(cherry picked from commit 0b3a87ef54)
This commit is contained in:
Miss Islington (bot) 2017-09-14 12:56:31 -07:00 committed by Serhiy Storchaka
parent 20fa05d022
commit f135f62cfd
3 changed files with 16 additions and 1 deletions

View File

@ -2735,6 +2735,15 @@ class Win32ProcessTestCase(BaseTestCase):
stdout=subprocess.PIPE, stdout=subprocess.PIPE,
close_fds=True) close_fds=True)
@support.cpython_only
def test_issue31471(self):
# There shouldn't be an assertion failure in Popen() in case the env
# argument has a bad keys() method.
class BadEnv(dict):
keys = None
with self.assertRaises(TypeError):
subprocess.Popen([sys.executable, "-c", "pass"], env=BadEnv())
def test_close_fds(self): def test_close_fds(self):
# close file descriptors # close file descriptors
rc = subprocess.call([sys.executable, "-c", rc = subprocess.call([sys.executable, "-c",

View File

@ -0,0 +1,2 @@
Fix an assertion failure in `subprocess.Popen()` on Windows, in case the env
argument has a bad keys() method. Patch by Oren Milman.

View File

@ -723,9 +723,13 @@ getenvironment(PyObject* environment)
} }
keys = PyMapping_Keys(environment); keys = PyMapping_Keys(environment);
if (!keys) {
return NULL;
}
values = PyMapping_Values(environment); values = PyMapping_Values(environment);
if (!keys || !values) if (!values) {
goto error; goto error;
}
envsize = PySequence_Fast_GET_SIZE(keys); envsize = PySequence_Fast_GET_SIZE(keys);
if (PySequence_Fast_GET_SIZE(values) != envsize) { if (PySequence_Fast_GET_SIZE(values) != envsize) {