From: Guido van Rossum Date: Mon, 18 Mar 2002 03:05:36 +0000 (+0000) Subject: Fix for SF bug 528132 (Armin Rigo): classmethod().__get__() segfault X-Git-Tag: v2.2.1c1~14 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=09f2187704cdacc4e3f86b357d110445541e6ad7;p=thirdparty%2FPython%2Fcpython.git Fix for SF bug 528132 (Armin Rigo): classmethod().__get__() segfault The proper fix is not quite what was submitted; it's really better to take the class of the object passed rather than calling PyMethod_New with NULL pointer args, because that can then cause other core dumps later. I also added a testcase for the fix to classmethods() in test_descr.py. I'll apply this to 2.3 too. --- diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index 1188e1d560e2..ce28cce4a08a 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -1208,6 +1208,11 @@ def classmethods(): vereq(d.goo(1), (D, 1)) vereq(d.foo(1), (d, 1)) vereq(D.foo(d, 1), (d, 1)) + # Test for a specific crash (SF bug 528132) + def f(cls, arg): return (cls, arg) + ff = classmethod(f) + vereq(ff.__get__(0, int)(42), (int, 42)) + vereq(ff.__get__(0)(42), (int, 42)) def staticmethods(): if verbose: print "Testing static methods..." diff --git a/Objects/funcobject.c b/Objects/funcobject.c index f24cbcf4bf50..426b8f490a44 100644 --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -474,6 +474,8 @@ cm_descr_get(PyObject *self, PyObject *obj, PyObject *type) "uninitialized classmethod object"); return NULL; } + if (type == NULL) + type = (PyObject *)(obj->ob_type); return PyMethod_New(cm->cm_callable, type, (PyObject *)(type->ob_type)); }