summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Lib/ctypes/test/test_as_parameter.py1
-rw-r--r--Lib/ctypes/test/test_functions.py1
-rw-r--r--Misc/NEWS5
-rw-r--r--Modules/_ctypes/callbacks.c2
4 files changed, 8 insertions, 1 deletions
diff --git a/Lib/ctypes/test/test_as_parameter.py b/Lib/ctypes/test/test_as_parameter.py
index 5716f16c7e..0581059335 100644
--- a/Lib/ctypes/test/test_as_parameter.py
+++ b/Lib/ctypes/test/test_as_parameter.py
@@ -61,6 +61,7 @@ class BasicWrapTestCase(unittest.TestCase):
def callback(v):
args.append(v)
+ return v
CallBack = CFUNCTYPE(c_int, c_int)
diff --git a/Lib/ctypes/test/test_functions.py b/Lib/ctypes/test/test_functions.py
index bfa0cad911..759aea7eee 100644
--- a/Lib/ctypes/test/test_functions.py
+++ b/Lib/ctypes/test/test_functions.py
@@ -222,6 +222,7 @@ class FunctionTestCase(unittest.TestCase):
def callback(v):
args.append(v)
+ return v
CallBack = CFUNCTYPE(c_int, c_int)
diff --git a/Misc/NEWS b/Misc/NEWS
index ab40d3defb..dc99ff799a 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -64,6 +64,11 @@ Core and builtins
Library
-------
+- If a the Python part of a ctypes callback function returns None,
+ and this cannot be converted to the required C type, an exception is
+ printed with PyErr_WriteUnraisable. Before this change, the C
+ callback did return arbitrary values to the calling code.
+
- The __repr__ method of a NULL ctypes.py_object() no longer raises
an exception.
diff --git a/Modules/_ctypes/callbacks.c b/Modules/_ctypes/callbacks.c
index cbe3d03d7e..c8e669a86e 100644
--- a/Modules/_ctypes/callbacks.c
+++ b/Modules/_ctypes/callbacks.c
@@ -205,7 +205,7 @@ if (x == NULL) _AddTraceback(what, __FILE__, __LINE__ - 1), PyErr_Print()
result = PyObject_CallObject(callable, arglist);
CHECK("'calling callback function'", result);
- if ((restype != &ffi_type_void) && result && result != Py_None) {
+ if ((restype != &ffi_type_void) && result) {
PyObject *keep;
assert(setfunc);
#ifdef WORDS_BIGENDIAN