From 6a650aaf7735e30636db2721247f317064c2cfd4 Mon Sep 17 00:00:00 2001 From: Sergey Fedoseev Date: Fri, 30 Aug 2019 09:25:48 +0500 Subject: [PATCH] bpo-37976: Prevent shadowing of TypeError in zip() (GH-15592) --- Lib/test/test_builtin.py | 12 ++++++++++++ Lib/test/test_itertools.py | 12 ++++++++++++ Modules/itertoolsmodule.c | 4 ---- Python/bltinmodule.c | 4 ---- 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index 61155799c44..1100c49e9b8 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -1477,6 +1477,18 @@ class BuiltinTest(unittest.TestCase): z1 = zip(a, b) self.check_iter_pickle(z1, t, proto) + def test_zip_bad_iterable(self): + exception = TypeError() + + class BadIterable: + def __iter__(self): + raise exception + + with self.assertRaises(TypeError) as cm: + zip(BadIterable()) + + self.assertIs(cm.exception, exception) + def test_format(self): # Test the basic machinery of the format() builtin. Don't test # the specifics of the various formatters diff --git a/Lib/test/test_itertools.py b/Lib/test/test_itertools.py index 573739fde14..98b8c837318 100644 --- a/Lib/test/test_itertools.py +++ b/Lib/test/test_itertools.py @@ -971,6 +971,18 @@ class TestBasicOps(unittest.TestCase): self.pickletest(proto, zip_longest("abc", "defgh", fillvalue=1)) self.pickletest(proto, zip_longest("", "defgh")) + def test_zip_longest_bad_iterable(self): + exception = TypeError() + + class BadIterable: + def __iter__(self): + raise exception + + with self.assertRaises(TypeError) as cm: + zip_longest(BadIterable()) + + self.assertIs(cm.exception, exception) + def test_bug_7244(self): class Repeater: diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c index 101addcfd3a..ab473e29fbd 100644 --- a/Modules/itertoolsmodule.c +++ b/Modules/itertoolsmodule.c @@ -4442,10 +4442,6 @@ zip_longest_new(PyTypeObject *type, PyObject *args, PyObject *kwds) PyObject *item = PyTuple_GET_ITEM(args, i); PyObject *it = PyObject_GetIter(item); if (it == NULL) { - if (PyErr_ExceptionMatches(PyExc_TypeError)) - PyErr_Format(PyExc_TypeError, - "zip_longest argument #%zd must support iteration", - i+1); Py_DECREF(ittuple); return NULL; } diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 7f187eacd16..63e58128651 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -2548,10 +2548,6 @@ zip_new(PyTypeObject *type, PyObject *args, PyObject *kwds) PyObject *item = PyTuple_GET_ITEM(args, i); PyObject *it = PyObject_GetIter(item); if (it == NULL) { - if (PyErr_ExceptionMatches(PyExc_TypeError)) - PyErr_Format(PyExc_TypeError, - "zip argument #%zd must support iteration", - i+1); Py_DECREF(ittuple); return NULL; }