[Python-checkins] [3.6] bpo-31471: Fix assertion failure in subprocess.Popen() on Windows, in case env has a bad keys() method. (GH-3580) (#3584)
Serhiy Storchaka
webhook-mailer at python.org
Thu Sep 14 15:56:37 EDT 2017
https://github.com/python/cpython/commit/f135f62cfd1529cbb9326e53728a22afd05b6bc3
commit: f135f62cfd1529cbb9326e53728a22afd05b6bc3
branch: 3.6
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: Serhiy Storchaka <storchaka at gmail.com>
date: 2017-09-14T22:56:31+03:00
summary:
[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)
files:
A Misc/NEWS.d/next/Core and Builtins/2017-09-14-19-47-57.bpo-31471.0yiA5Q.rst
M Lib/test/test_subprocess.py
M Modules/_winapi.c
diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py
index df3f7506a93..391d08cd9c3 100644
--- a/Lib/test/test_subprocess.py
+++ b/Lib/test/test_subprocess.py
@@ -2735,6 +2735,15 @@ def test_invalid_args(self):
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 00000000000..73c444444fc
--- /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 1606f0da772..b98e7789b78 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) {
More information about the Python-checkins
mailing list