summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/ctypes/test/test_struct_fields.py8
-rw-r--r--Modules/_ctypes/cfield.c4
2 files changed, 11 insertions, 1 deletions
diff --git a/Lib/ctypes/test/test_struct_fields.py b/Lib/ctypes/test/test_struct_fields.py
index 8045cc8..ee8415f 100644
--- a/Lib/ctypes/test/test_struct_fields.py
+++ b/Lib/ctypes/test/test_struct_fields.py
@@ -46,6 +46,14 @@ class StructFieldsTestCase(unittest.TestCase):
Y._fields_ = []
self.assertRaises(AttributeError, setattr, X, "_fields_", [])
+ def test_5(self):
+ class X(Structure):
+ _fields_ = (("char", c_char * 5),)
+
+ x = X(b'#' * 5)
+ x.char = b'a\0b\0'
+ self.assertEqual(bytes(x), b'a\x00###')
+
# __set__ and __get__ should raise a TypeError in case their self
# argument is not a ctype instance.
def test___set__(self):
diff --git a/Modules/_ctypes/cfield.c b/Modules/_ctypes/cfield.c
index 7f85319..32a2bee 100644
--- a/Modules/_ctypes/cfield.c
+++ b/Modules/_ctypes/cfield.c
@@ -1263,7 +1263,9 @@ s_set(void *ptr, PyObject *value, Py_ssize_t length)
}
data = PyBytes_AS_STRING(value);
- size = strlen(data); /* XXX Why not Py_SIZE(value)? */
+ // bpo-39593: Use strlen() to truncate the string at the first null character.
+ size = strlen(data);
+
if (size < length) {
/* This will copy the terminating NUL character
* if there is space for it.