issue #3554: ctypes.string_at and ctypes.wstring_at must use the
pythonapi calling convention so that the GIL is held and error return
values are checked.
diff --git a/Lib/ctypes/__init__.py b/Lib/ctypes/__init__.py
index ef90bc7..7ad9e2b 100644
--- a/Lib/ctypes/__init__.py
+++ b/Lib/ctypes/__init__.py
@@ -485,7 +485,7 @@
def cast(obj, typ):
return _cast(obj, obj, typ)
-_string_at = CFUNCTYPE(py_object, c_void_p, c_int)(_string_at_addr)
+_string_at = PYFUNCTYPE(py_object, c_void_p, c_int)(_string_at_addr)
def string_at(ptr, size=-1):
"""string_at(addr[, size]) -> string
@@ -497,7 +497,7 @@
except ImportError:
pass
else:
- _wstring_at = CFUNCTYPE(py_object, c_void_p, c_int)(_wstring_at_addr)
+ _wstring_at = PYFUNCTYPE(py_object, c_void_p, c_int)(_wstring_at_addr)
def wstring_at(ptr, size=-1):
"""wstring_at(addr[, size]) -> string
diff --git a/Misc/NEWS b/Misc/NEWS
index 954ae7e..82c579d 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -77,6 +77,10 @@
Library
-------
+- Issue #3554: ctypes.string_at and ctypes.wstring_at did call Python
+ api functions without holding the GIL, which could lead to a fatal
+ error when they failed.
+
- Issue #2234: distutils failed for some versions of the cygwin compiler. The
version reported by these tools does not necessarily follow the python
version numbering scheme, so the module is less strict when parsing it.