From be9715398b87df269d0781a7c436e10cfa4a0ea4 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Wed, 18 Jun 2003 01:13:41 +0000 Subject: SF bug #753451: classmethod abuse --> SystemError Check the argument to classmethod for callability. Backport candidate. --- Lib/test/test_descr.py | 8 ++++++++ Objects/funcobject.c | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index 9587596..46e3c48 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -1485,6 +1485,14 @@ def classmethods(): vereq(super(D,D).goo(), (D,)) vereq(super(D,d).goo(), (D,)) + # Verify that argument is checked for callability (SF bug 753451) + try: + classmethod(1).__get__(1) + except TypeError: + pass + else: + raise TestFailed, "classmethod should check for callability" + def classmethods_in_c(): if verbose: print "Testing C-based class methods..." import xxsubtype as spam diff --git a/Objects/funcobject.c b/Objects/funcobject.c index 8f2d8df..c414bca 100644 --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -640,6 +640,12 @@ cm_init(PyObject *self, PyObject *args, PyObject *kwds) if (!PyArg_UnpackTuple(args, "classmethod", 1, 1, &callable)) return -1; + if (!PyCallable_Check(callable)) { + PyErr_Format(PyExc_TypeError, "'%s' object is not callable", + callable->ob_type->tp_name); + return -1; + } + Py_INCREF(callable); cm->cm_callable = callable; return 0; -- cgit v0.12