From: Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> Date: Thu, 14 Sep 2017 19:56:31 +0000 (-0700) Subject: [3.6] bpo-31471: Fix assertion failure in subprocess.Popen() on Windows, in case... X-Git-Tag: v3.6.3rc1~17 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f135f62cfd1529cbb9326e53728a22afd05b6bc3;p=thirdparty%2FPython%2Fcpython.git [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 0b3a87ef54a0112b74e8a1d8c6f87d10db4239ab) --- diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index df3f7506a932..391d08cd9c3c 100644 --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -2735,6 +2735,15 @@ class Win32ProcessTestCase(BaseTestCase): stdout=subprocess.PIPE, 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): # close file descriptors rc = subprocess.call([sys.executable, "-c", diff --git a/Misc/NEWS.d/next/Core and Builtins/2017-09-14-19-47-57.bpo-31471.0yiA5Q.rst b/Misc/NEWS.d/next/Core and Builtins/2017-09-14-19-47-57.bpo-31471.0yiA5Q.rst new file mode 100644 index 000000000000..73c444444fca --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2017-09-14-19-47-57.bpo-31471.0yiA5Q.rst @@ -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. diff --git a/Modules/_winapi.c b/Modules/_winapi.c index 1606f0da772c..b98e7789b787 100644 --- a/Modules/_winapi.c +++ b/Modules/_winapi.c @@ -723,9 +723,13 @@ getenvironment(PyObject* environment) } keys = PyMapping_Keys(environment); + if (!keys) { + return NULL; + } values = PyMapping_Values(environment); - if (!keys || !values) + if (!values) { goto error; + } envsize = PySequence_Fast_GET_SIZE(keys); if (PySequence_Fast_GET_SIZE(values) != envsize) {