From a97011b9b8c8111f42e1e7594081956136d848da Mon Sep 17 00:00:00 2001 From: Hai Shi Date: Tue, 2 Jun 2020 00:54:18 +0800 Subject: bpo-39593: Add test on ctypes cfield.c s_set() (GH-18424) --- Lib/ctypes/test/test_struct_fields.py | 8 ++++++++ Modules/_ctypes/cfield.c | 4 +++- 2 files changed, 11 insertions(+), 1 deletion(-) 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. -- cgit v0.12