Skip to content

Commit

Permalink
[3.12] gh-126937: ctypes: add test for maximum size of a struct field (
Browse files Browse the repository at this point in the history
…GH-126938) (GH-127825) (GH-127909)

This backports the *test* from GH-126938, with changed limit and exception class.

Co-authored-by: Melissa0x1f992 <[email protected]>
Co-authored-by: Peter Bierma <[email protected]>
Co-authored-by: Terry Jan Reedy <[email protected]>

(cherry-picked from d51c144)
  • Loading branch information
encukou authored Dec 13, 2024
1 parent 58916eb commit d036855
Showing 1 changed file with 22 additions and 0 deletions.
22 changes: 22 additions & 0 deletions Lib/test/test_ctypes/test_struct_fields.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import unittest
import sys
from ctypes import *

class StructFieldsTestCase(unittest.TestCase):
Expand Down Expand Up @@ -69,6 +70,27 @@ def __init_subclass__(cls, **kwargs):
'ctypes state is not initialized'):
class Subclass(BrokenStructure): ...

def test_max_field_size_gh126937(self):
# Classes for big structs should be created successfully.
# (But they most likely can't be instantiated.)
# The size must fit in Py_ssize_t.

class X(Structure):
_fields_ = [('char', c_char),]
max_field_size = sys.maxsize

class Y(Structure):
_fields_ = [('largeField', X * max_field_size)]
class Z(Structure):
_fields_ = [('largeField', c_char * max_field_size)]

with self.assertRaises(OverflowError):
class TooBig(Structure):
_fields_ = [('largeField', X * (max_field_size + 1))]
with self.assertRaises(OverflowError):
class TooBig(Structure):
_fields_ = [('largeField', c_char * (max_field_size + 1))]

# __set__ and __get__ should raise a TypeError in case their self
# argument is not a ctype instance.
def test___set__(self):
Expand Down

0 comments on commit d036855

Please sign in to comment.