From b91ef008baf3f6954bf2849f7b5235f9d1a1f6d8 Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Sun, 19 May 2013 19:38:12 -0700 Subject: add missing NULL check (closes #18019) --- Lib/test/test_dictviews.py | 5 +++++ Misc/NEWS | 3 +++ Objects/dictobject.c | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/Lib/test/test_dictviews.py b/Lib/test/test_dictviews.py index f903676..b264ff2 100644 --- a/Lib/test/test_dictviews.py +++ b/Lib/test/test_dictviews.py @@ -144,6 +144,11 @@ class DictSetTest(unittest.TestCase): self.assertEqual(d1.viewitems() ^ d3.viewitems(), {('a', 1), ('b', 2), ('d', 4), ('e', 5)}) + def test_recursive_repr(self): + d = {} + d[42] = d.viewvalues() + self.assertRaises(RuntimeError, repr, d) + diff --git a/Misc/NEWS b/Misc/NEWS index efd7724..cb7fd60 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -9,6 +9,9 @@ What's New in Python 2.7.6? Core and Builtins ----------------- +- Issue #18019: Fix crash in the repr of dictionaries containing their own + views. + Library ------- diff --git a/Objects/dictobject.c b/Objects/dictobject.c index ba36b18..39e7035 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -2919,6 +2919,10 @@ dictview_repr(dictviewobject *dv) return NULL; seq_str = PyObject_Repr(seq); + if (seq_str == NULL) { + Py_DECREF(seq); + return NULL; + } result = PyString_FromFormat("%s(%s)", Py_TYPE(dv)->tp_name, PyString_AS_STRING(seq_str)); Py_DECREF(seq_str); -- cgit v0.12