mirror of
https://github.com/python/cpython.git
synced 2025-11-25 21:11:09 +00:00
Issue #6083: Fix multiple segmentation faults occured when PyArg_ParseTuple
parses nested mutating sequence.
This commit is contained in:
commit
b6a53404b7
7 changed files with 118 additions and 17 deletions
|
|
@ -33,5 +33,33 @@ class ReturnFuncPtrTestCase(unittest.TestCase):
|
|||
self.assertRaises(ArgumentError, strchr, b"abcdef", 3.0)
|
||||
self.assertRaises(TypeError, strchr, b"abcdef")
|
||||
|
||||
def test_from_dll(self):
|
||||
dll = CDLL(_ctypes_test.__file__)
|
||||
# _CFuncPtr instances are now callable with a tuple argument
|
||||
# which denotes a function name and a dll:
|
||||
strchr = CFUNCTYPE(c_char_p, c_char_p, c_char)(("strchr", dll))
|
||||
self.assertTrue(strchr(b"abcdef", b"b"), "bcdef")
|
||||
self.assertEqual(strchr(b"abcdef", b"x"), None)
|
||||
self.assertRaises(ArgumentError, strchr, b"abcdef", 3.0)
|
||||
self.assertRaises(TypeError, strchr, b"abcdef")
|
||||
|
||||
# Issue 6083: Reference counting bug
|
||||
def test_test_from_dll_refcount(self):
|
||||
class BadSequence(tuple):
|
||||
def __getitem__(self, key):
|
||||
if key == 0:
|
||||
return "strchr"
|
||||
if key == 1:
|
||||
return CDLL(_ctypes_test.__file__)
|
||||
raise IndexError
|
||||
|
||||
# _CFuncPtr instances are now callable with a tuple argument
|
||||
# which denotes a function name and a dll:
|
||||
strchr = CFUNCTYPE(c_char_p, c_char_p, c_char)(BadSequence(("strchr", CDLL(_ctypes_test.__file__))))
|
||||
self.assertTrue(strchr(b"abcdef", b"b"), "bcdef")
|
||||
self.assertEqual(strchr(b"abcdef", b"x"), None)
|
||||
self.assertRaises(ArgumentError, strchr, b"abcdef", 3.0)
|
||||
self.assertRaises(TypeError, strchr, b"abcdef")
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue