Kaydet (Commit) 57adf22f authored tarafından Thomas Heller's avatar Thomas Heller

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.
üst 67d1981c
......@@ -488,7 +488,7 @@ _cast = PYFUNCTYPE(py_object, c_void_p, py_object, py_object)(_cast_addr)
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
......@@ -500,7 +500,7 @@ try:
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
......
......@@ -3,6 +3,17 @@ import unittest
from ctypes import *
class MemFunctionsTest(unittest.TestCase):
def test_overflow(self):
# string_at and wstring_at must use the Python calling
# convention (which acquires the GIL and checks the Python
# error flag). Provoke an error and catch it; see also issue
# #3554: <http://bugs.python.org/issue3554>
if hasattr(sys, "maxsize"):
self.assertRaises((OverflowError, MemoryError),
lambda: wstring_at(u"foo", sys.maxsize))
self.assertRaises((OverflowError, MemoryError),
lambda: string_at("foo", sys.maxsize))
def test_memmove(self):
# large buffers apparently increase the chance that the memory
# is allocated in high address space.
......
......@@ -199,6 +199,10 @@ Core and Builtins
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 #799428: Fix Tkinter.Misc._nametowidget to unwrap Tcl command objects.
- Issue #3395: fix reference in test_multiprocessing to old debugInfo method
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment