-
-
Notifications
You must be signed in to change notification settings - Fork 32.4k
Closed
Labels
3.11only security fixesonly security fixes3.12only security fixesonly security fixes3.13bugs and security fixesbugs and security fixesstdlibPython modules in the Lib dirPython modules in the Lib dirtopic-ctypestype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
Description
Bug report
The classes ctypes.BigEndianUnion and ctypes.LittleEndianUnion was added in Python 3.11. In the case of the use of an Union
in a Structure
class that match the opposite system endianness, the Union
class can't be used as shown below:
# coding: utf-8
import sys
import ctypes as c
assert sys.byteorder == "little"
"""
struct MyStruct {
unsigned char a;
unsigned char b:
};
struct MainStruct {
union {
struct MyStruct my_struct;
short field_ab;
} my_union;
unsigned char foo;
};
"""
class MyStruct(c.BigEndianStructure):
_fields_ = [("a", c.c_byte), ("b", c.c_byte)]
class MyUnion(c.BigEndianUnion):
_fields_ = [("my_struct", MyStruct), ("ab", c.c_short)]
class MainStruct(c.BigEndianStructure):
_fields_ = [("my_union", MyUnion), ("foo", c.c_byte)]
The following traceback is given by the interpretor:
TypeError Traceback (most recent call last)
Cell In[1], line 28
24 class MyUnion(c.BigEndianUnion):
25 _fields_ = [("my_struct", MyStruct), ("ab", c.c_short)]
---> 28 class MainStruct(c.BigEndianStructure):
29 _fields_ = [("my_union", MyUnion), ("foo", c.c_byte)]
File ~\AppData\Local\Programs\Python\Python311\Lib\ctypes\_endian.py:31, in _swapped_meta.__setattr__(self, attrname, value)
29 typ = desc[1]
30 rest = desc[2:]
---> 31 fields.append((name, _other_endian(typ)) + rest)
32 value = fields
33 super().__setattr__(attrname, value)
File ~\AppData\Local\Programs\Python\Python311\Lib\ctypes\_endian.py:21, in _other_endian(typ)
19 if issubclass(typ, Structure):
20 return typ
---> 21 raise TypeError("This type does not support other endian: %s" % typ)
TypeError: This type does not support other endian: <class '__main__.MyUnion'>
Your environment
- CPython versions tested on: Interpreter compiled from the main branch in debug mode and also Python 3.11 (coming from the official release)
- Operating system and architecture: Windows 10 x64
Linked PRs
- gh-105102: fix nested unions in structures when the system byteorder is the opposite #105106
- [3.12] gh-105102: Fix nested unions in structures when the system byteorder is the opposite (GH-105106) #114204
- [3.11] gh-105102: Fix nested unions in structures when the system byteorder is the opposite (GH-105106) #114205
Metadata
Metadata
Assignees
Labels
3.11only security fixesonly security fixes3.12only security fixesonly security fixes3.13bugs and security fixesbugs and security fixesstdlibPython modules in the Lib dirPython modules in the Lib dirtopic-ctypestype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error