Skip to content

TypeError when using ctypes.BigEndianUnion nested in ctypes.BigEndianStructure on a little endian system (or vice versa) #105102

Closed

Description

@Sh3idan

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

Activity

  1. added
    stdlibStandard Library Python modules in the Lib/ directory
    on Nov 24, 2023
  2. added 4 commits that reference this issue on Jan 17, 2024
  3. added 2 commits that reference this issue on Jan 17, 2024
  4. added a commit that references this issue on Jan 22, 2024
  5. added a commit that references this issue on Feb 11, 2024
  6. added a commit that references this issue on Sep 2, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    3.11only security fixes3.12only security fixes3.13only security fixesstdlibStandard Library Python modules in the Lib/ directorytopic-ctypestype-bugAn unexpected behavior, bug, or error

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions