]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.13] gh-126937: ctypes: add test for maximum size of a struct field (GH-126938...
authorPetr Viktorin <encukou@gmail.com>
Thu, 12 Dec 2024 12:02:57 +0000 (13:02 +0100)
committerGitHub <noreply@github.com>
Thu, 12 Dec 2024 12:02:57 +0000 (13:02 +0100)
This backports the *test* from GH-126938, with changed limit and exception class.

Co-authored-by: Melissa0x1f992 <70096546+Melissa0x1f992@users.noreply.github.com>
Co-authored-by: Peter Bierma <zintensitydev@gmail.com>
Co-authored-by: Terry Jan Reedy <tjreedy@udel.edu>
Lib/test/test_ctypes/test_struct_fields.py

index 7adab794809def07cf84d9afd0dc0e74291b13cb..fd9509757a39ad87b96f766432233a95d665ff4d 100644 (file)
@@ -1,4 +1,5 @@
 import unittest
+import sys
 from ctypes import Structure, Union, sizeof, c_char, c_int
 from ._support import (CField, Py_TPFLAGS_DISALLOW_INSTANTIATION,
                        Py_TPFLAGS_IMMUTABLETYPE)
@@ -75,6 +76,27 @@ class StructFieldsTestCase(unittest.TestCase):
                                     '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):