mirror of
https://github.com/python/cpython.git
synced 2025-08-03 00:23:06 +00:00
GH-81061: Fix refcount issue when returning None
from a ctypes.py_object
callback (GH-13364)
(cherry picked from commit 837ba05267
)
Co-authored-by: dgelessus <dgelessus@users.noreply.github.com>
This commit is contained in:
parent
074b881e11
commit
2d1128e9eb
3 changed files with 24 additions and 8 deletions
|
@ -97,5 +97,20 @@ class AnotherLeak(unittest.TestCase):
|
|||
f(1, 2)
|
||||
self.assertEqual(sys.getrefcount(ctypes.c_int), a)
|
||||
|
||||
@support.refcount_test
|
||||
def test_callback_py_object_none_return(self):
|
||||
# bpo-36880: test that returning None from a py_object callback
|
||||
# does not decrement the refcount of None.
|
||||
|
||||
for FUNCTYPE in (ctypes.CFUNCTYPE, ctypes.PYFUNCTYPE):
|
||||
with self.subTest(FUNCTYPE=FUNCTYPE):
|
||||
@FUNCTYPE(ctypes.py_object)
|
||||
def func():
|
||||
return None
|
||||
|
||||
# Check that calling func does not affect None's refcount.
|
||||
for _ in range(10000):
|
||||
func()
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
Fix a reference counting issue when a :mod:`ctypes` callback with return
|
||||
type :class:`~ctypes.py_object` returns ``None``, which could cause crashes.
|
|
@ -276,15 +276,14 @@ static void _CallPythonObject(void *mem,
|
|||
"of ctypes callback function",
|
||||
callable);
|
||||
}
|
||||
else if (keep == Py_None) {
|
||||
/* Nothing to keep */
|
||||
Py_DECREF(keep);
|
||||
}
|
||||
else if (setfunc != _ctypes_get_fielddesc("O")->setfunc) {
|
||||
if (-1 == PyErr_WarnEx(PyExc_RuntimeWarning,
|
||||
"memory leak in callback function.",
|
||||
1))
|
||||
{
|
||||
if (keep == Py_None) {
|
||||
/* Nothing to keep */
|
||||
Py_DECREF(keep);
|
||||
}
|
||||
else if (PyErr_WarnEx(PyExc_RuntimeWarning,
|
||||
"memory leak in callback function.",
|
||||
1) == -1) {
|
||||
_PyErr_WriteUnraisableMsg("on converting result "
|
||||
"of ctypes callback function",
|
||||
callable);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue