From b16e382c446d76ede22780b15c75f43c5f132e25 Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Sun, 13 Oct 2019 05:49:05 -0600 Subject: [PATCH] bpo-38202: Fix a crash in dict_view & non-itearble. (GH-16241) --- Lib/test/test_dictviews.py | 19 +++++++++++++++++++ Objects/dictobject.c | 4 ++++ 2 files changed, 23 insertions(+) diff --git a/Lib/test/test_dictviews.py b/Lib/test/test_dictviews.py index 8410e8b5c44..be271bebaaf 100644 --- a/Lib/test/test_dictviews.py +++ b/Lib/test/test_dictviews.py @@ -227,6 +227,25 @@ class DictSetTest(unittest.TestCase): self.assertEqual(items | iter([(1, 2)]), {(1, 2), (3, 4)}) self.assertEqual(items - iter([(1, 2)]), {(3, 4)}) + def test_set_operations_with_noniterable(self): + with self.assertRaises(TypeError): + {}.keys() & 1 + with self.assertRaises(TypeError): + {}.keys() | 1 + with self.assertRaises(TypeError): + {}.keys() ^ 1 + with self.assertRaises(TypeError): + {}.keys() - 1 + + with self.assertRaises(TypeError): + {}.items() & 1 + with self.assertRaises(TypeError): + {}.items() | 1 + with self.assertRaises(TypeError): + {}.items() ^ 1 + with self.assertRaises(TypeError): + {}.items() - 1 + def test_recursive_repr(self): d = {} d[42] = d.values() diff --git a/Objects/dictobject.c b/Objects/dictobject.c index b496350d470..64876e05191 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -4227,6 +4227,10 @@ _PyDictView_Intersect(PyObject* self, PyObject *other) return NULL; it = PyObject_GetIter(other); + if (it == NULL) { + Py_DECREF(result); + return NULL; + } if (PyDictKeys_Check(self)) { dict_contains = dictkeys_contains;