https://github.com/python/cpython/commit/d51c1444e36e2cfdb33087f165819a7cd6774a9e
commit: d51c1444e36e2cfdb33087f165819a7cd6774a9e
branch: 3.13
author: Petr Viktorin <[email protected]>
committer: encukou <[email protected]>
date: 2024-12-12T13:02:57+01:00
summary:

[3.13] gh-126937: ctypes: add test for maximum size of a struct field 
(GH-126938) (GH-127825)

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]>

files:
M Lib/test/test_ctypes/test_struct_fields.py

diff --git a/Lib/test/test_ctypes/test_struct_fields.py 
b/Lib/test/test_ctypes/test_struct_fields.py
index 7adab794809def..fd9509757a39ad 100644
--- a/Lib/test/test_ctypes/test_struct_fields.py
+++ b/Lib/test/test_ctypes/test_struct_fields.py
@@ -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 @@ 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):

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]

Reply via email to