]> granicus.if.org Git - python/commitdiff
Put method-wrappers into trashcan. Fixes #927248.
authorMartin v. Löwis <martin@v.loewis.de>
Mon, 3 Jul 2006 13:47:40 +0000 (13:47 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Mon, 3 Jul 2006 13:47:40 +0000 (13:47 +0000)
Lib/test/test_descr.py
Misc/NEWS
Objects/descrobject.c

index d9249b6cd2cf055a57f2abbc86d62872e9eec65c..6484ef1a75812ba6a632aeaae5d3b762ad17bb55 100644 (file)
@@ -3966,6 +3966,13 @@ def weakref_segfault():
     o.whatever = Provoker(o)
     del o
 
+def wrapper_segfault():
+    # SF 927248: deeply nested wrappers could cause stack overflow
+    f = lambda:None
+    for i in xrange(1000000):
+        f = f.__call__
+    f = None
+
 # Fix SF #762455, segfault when sys.stdout is changed in getattr
 def filefault():
     if verbose:
@@ -4121,6 +4128,7 @@ def notimplemented():
 
 def test_main():
     weakref_segfault() # Must be first, somehow
+    wrapper_segfault()
     do_this_first()
     class_docstrings()
     lists()
index 11add31de4453e59eb4dbc532becd4695ef263ed..34795a438ef4d17bc67a32e7beb1702be12e78c7 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,9 @@ What's New in Python 2.5 beta 2?
 Core and builtins
 -----------------
 
+- Bug #927248: Recursive method-wrapper objects can now safely
+  be released.
+
 - Bug #1417699: Reject locale-specific decimal point in float()
   and atof().
 
index 606ef053049ef23e60e9a65abd9b83dffa04fba8..51676f6b0622628b77eda297d2332cf45db12aa7 100644 (file)
@@ -892,10 +892,12 @@ typedef struct {
 static void
 wrapper_dealloc(wrapperobject *wp)
 {
-       _PyObject_GC_UNTRACK(wp);
+       PyObject_GC_UnTrack(wp);
+       Py_TRASHCAN_SAFE_BEGIN(wp)
        Py_XDECREF(wp->descr);
        Py_XDECREF(wp->self);
        PyObject_GC_Del(wp);
+       Py_TRASHCAN_SAFE_END(wp)
 }
 
 static int