summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAmaury Forgeot d'Arc <amauryfa@gmail.com>2011-09-12 19:03:36 (GMT)
committerAmaury Forgeot d'Arc <amauryfa@gmail.com>2011-09-12 19:03:36 (GMT)
commitbbe46d63ee9b624c011b4fe50978e2e7fa7cf82e (patch)
treeb8ffdf974ee62f8164b0ed12ac67b0580faf5576
parent1d7deafeea8fad9c58480f646e7ac125105288c5 (diff)
downloadcpython-bbe46d63ee9b624c011b4fe50978e2e7fa7cf82e.zip
cpython-bbe46d63ee9b624c011b4fe50978e2e7fa7cf82e.tar.gz
cpython-bbe46d63ee9b624c011b4fe50978e2e7fa7cf82e.tar.bz2
Issue #12483: ctypes: Fix a crash when the destruction of a callback
object triggers the garbage collector.
-rw-r--r--Lib/ctypes/test/test_callbacks.py8
-rw-r--r--Misc/NEWS3
-rw-r--r--Modules/_ctypes/callbacks.c1
3 files changed, 12 insertions, 0 deletions
diff --git a/Lib/ctypes/test/test_callbacks.py b/Lib/ctypes/test/test_callbacks.py
index 8801ccd..c7207ea 100644
--- a/Lib/ctypes/test/test_callbacks.py
+++ b/Lib/ctypes/test/test_callbacks.py
@@ -134,6 +134,14 @@ class Callbacks(unittest.TestCase):
if isinstance(x, X)]
self.assertEqual(len(live), 0)
+ def test_issue12483(self):
+ import gc
+ class Nasty:
+ def __del__(self):
+ gc.collect()
+ CFUNCTYPE(None)(lambda x=Nasty(): None)
+
+
try:
WINFUNCTYPE
except NameError:
diff --git a/Misc/NEWS b/Misc/NEWS
index d9e8f4b..d52156d 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -65,6 +65,9 @@ Tests
Extension Modules
-----------------
+- Issue #12483: ctypes: Fix a crash when the destruction of a callback
+ object triggers the garbage collector.
+
- Issue #12950: Fix passing file descriptors in multiprocessing, under
OpenIndiana/Illumos.
diff --git a/Modules/_ctypes/callbacks.c b/Modules/_ctypes/callbacks.c
index d23509f..34c46ad 100644
--- a/Modules/_ctypes/callbacks.c
+++ b/Modules/_ctypes/callbacks.c
@@ -13,6 +13,7 @@ static void
CThunkObject_dealloc(PyObject *_self)
{
CThunkObject *self = (CThunkObject *)_self;
+ PyObject_GC_UnTrack(self);
Py_XDECREF(self->converters);
Py_XDECREF(self->callable);
Py_XDECREF(self->restype);