From b6b8942f5302e76178833dc33596b892fef8f85f Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Mon, 15 Apr 2002 01:03:30 +0000 Subject: [PATCH] SF bug #541883 (Vincent Fiack). A stupid bug in object_set_class(): didn't check for value==NULL before checking its type. Bugfix candidate. --- Lib/test/test_descr.py | 6 ++++++ Objects/typeobject.c | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index ab5595287c4..872b7ece5d4 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -2352,6 +2352,12 @@ def setclass(): pass else: raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C) + try: + delattr(x, "__class__") + except TypeError: + pass + else: + raise TestFailed, "shouldn't allow del %r.__class__" % x cant(C(), list) cant(list(), C) cant(C(), 1) diff --git a/Objects/typeobject.c b/Objects/typeobject.c index d2902784a9d..deb73201ebb 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -1605,6 +1605,11 @@ object_set_class(PyObject *self, PyObject *value, void *closure) PyTypeObject *old = self->ob_type; PyTypeObject *new, *newbase, *oldbase; + if (value == NULL) { + PyErr_SetString(PyExc_TypeError, + "can't delete __class__ attribute"); + return -1; + } if (!PyType_Check(value)) { PyErr_Format(PyExc_TypeError, "__class__ must be set to new-style class, not '%s' object",