From 6e7832b04caf33196a56c153821631d33bbb3bff Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Fri, 16 Mar 2012 09:32:59 -0500 Subject: [PATCH] check to make sure the attribute is a string (#14334) --- Lib/test/test_descr.py | 3 +++ Misc/NEWS | 3 +++ Objects/typeobject.c | 7 +++++++ 3 files changed, 13 insertions(+) diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index 4050524e4c5..28dfbffe2d8 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -4554,6 +4554,9 @@ order (MRO) for bases """ self.assertRaises(AttributeError, getattr, EvilGetattribute(), "attr") + def test_type___getattribute__(self): + self.assertRaises(TypeError, type.__getattribute__, list, type) + def test_abstractmethods(self): # type pretends not to have __abstractmethods__. self.assertRaises(AttributeError, getattr, type, "__abstractmethods__") diff --git a/Misc/NEWS b/Misc/NEWS index b8edcaa831e..40c88d9572c 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -9,6 +9,9 @@ What's New in Python 2.7.4 Core and Builtins ----------------- +- Issue #14334: Prevent in a segfault in type.__getattribute__ when it was not + passed strings. + - Issue #14161: fix the __repr__ of file objects to escape the file name. - Issue #1469629: Allow cycles through an object's __dict__ slot to be diff --git a/Objects/typeobject.c b/Objects/typeobject.c index ce1d42b6ae7..877bcb78fa7 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -2530,6 +2530,13 @@ type_getattro(PyTypeObject *type, PyObject *name) PyObject *meta_attribute, *attribute; descrgetfunc meta_get; + if (!PyString_Check(name)) { + PyErr_Format(PyExc_TypeError, + "attribute name must be string, not '%.200s'", + name->ob_type->tp_name); + return NULL; + } + /* Initialize this type (we'll assume the metatype is initialized) */ if (type->tp_dict == NULL) { if (PyType_Ready(type) < 0)