]> granicus.if.org Git - python/commitdiff
Issue #23319: Fix ctypes.BigEndianStructure, swap correctly bytes. Patch
authorVictor Stinner <victor.stinner@gmail.com>
Wed, 29 Jul 2015 12:33:52 +0000 (14:33 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Wed, 29 Jul 2015 12:33:52 +0000 (14:33 +0200)
written by Matthieu Gautier.

Lib/ctypes/test/test_bitfields.py
Misc/NEWS
Modules/_ctypes/cfield.c

index 9ca053d20157faf3d41f2d2494fa36be09bc8c22..b39d82cc0b14cdf602623d0d660bd878b97e157a 100644 (file)
@@ -259,5 +259,33 @@ class BitFieldTest(unittest.TestCase):
         x.a = 0xFEDCBA9876543211
         self.assertEqual(x.a, 0xFEDCBA9876543211)
 
+    @need_symbol('c_uint32')
+    def test_uint32_swap_little_endian(self):
+        # Issue #23319
+        class Little(LittleEndianStructure):
+            _fields_ = [("a", c_uint32, 24),
+                        ("b", c_uint32, 4),
+                        ("c", c_uint32, 4)]
+        b = bytearray(4)
+        x = Little.from_buffer(b)
+        x.a = 0xabcdef
+        x.b = 1
+        x.c = 2
+        self.assertEqual(b, b'\xef\xcd\xab\x21')
+
+    @need_symbol('c_uint32')
+    def test_uint32_swap_big_endian(self):
+        # Issue #23319
+        class Big(BigEndianStructure):
+            _fields_ = [("a", c_uint32, 24),
+                        ("b", c_uint32, 4),
+                        ("c", c_uint32, 4)]
+        b = bytearray(4)
+        x = Big.from_buffer(b)
+        x.a = 0xabcdef
+        x.b = 1
+        x.c = 2
+        self.assertEqual(b, b'\xab\xcd\xef\x12')
+
 if __name__ == "__main__":
     unittest.main()
index 1f1d1b5c0d86f2399e6b42ee05760ff90b462fce..86267577bd733c7429a15fef205099cecb27c241 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -66,6 +66,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #23319: Fix ctypes.BigEndianStructure, swap correctly bytes. Patch
+  written by Matthieu Gautier.
+
 - Issue #23254: Document how to close the TCPServer listening socket.
   Patch from Martin Panter.
 
index 2078291731dfb82212de9c7278b6e73f9471a37e..c89d91956ab49253c81b6362bec08a89c122f020 100644 (file)
@@ -765,6 +765,7 @@ I_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
     if (get_ulong(value, &val) < 0)
         return  NULL;
     memcpy(&field, ptr, sizeof(field));
+    field = SWAP_INT(field);
     field = SET(unsigned int, field, (unsigned int)val, size);
     field = SWAP_INT(field);
     memcpy(ptr, &field, sizeof(field));