]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.12] gh-126937: ctypes: add test for maximum size of a struct field (GH-126938...
authorPetr Viktorin <encukou@gmail.com>
Fri, 13 Dec 2024 15:51:55 +0000 (16:51 +0100)
committerGitHub <noreply@github.com>
Fri, 13 Dec 2024 15:51:55 +0000 (16:51 +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>
(cherry-picked from d51c1444e36e2cfdb33087f165819a7cd6774a9e)

Lib/test/test_ctypes/test_struct_fields.py

index e444f5e1f77919b1a0a714f4d9517d364fe66645..2e7cd511886d4124a0bc8591ee3d6555a141078e 100644 (file)
@@ -1,4 +1,5 @@
 import unittest
+import sys
 from ctypes import *
 
 class StructFieldsTestCase(unittest.TestCase):
@@ -69,6 +70,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):