From 2a7dedef9e3d94fbbad3782fd4757c6b7ba91c09 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sat, 7 Aug 2004 04:55:30 +0000 Subject: SF bug #1004669: Type returned from .keys() is not checked --- Lib/test/test_builtin.py | 9 +++++++++ Objects/object.c | 5 +++++ 2 files changed, 14 insertions(+) diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index 6654f56..bc5afdc 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -322,6 +322,15 @@ class BuiltinTest(unittest.TestCase): ss['a3'] = 'a2*7' self.assertEqual(ss['a3'], 210) + # Verify that dir() catches a non-list returned by eval + # SF bug #1004669 + class C: + def __getitem__(self, item): + raise KeyError(item) + def keys(self): + return 'a' + self.assertRaises(TypeError, eval, 'dir()', globals(), C()) + # Done outside of the method test_z to get the correct scope z = 0 f = open(TESTFN, 'w') diff --git a/Objects/object.c b/Objects/object.c index 470da60..d8e403b 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -1702,6 +1702,11 @@ PyObject_Dir(PyObject *arg) } assert(result); + if (!PyList_Check(result)) { + PyErr_SetString(PyExc_TypeError, + "Expected keys() to be a list."); + goto error; + } if (PyList_Sort(result) != 0) goto error; else -- cgit v0.12