diff options
author | Hai Shi <shihai1992@gmail.com> | 2020-06-01 16:54:18 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-01 16:54:18 (GMT) |
commit | a97011b9b8c8111f42e1e7594081956136d848da (patch) | |
tree | c755b7df4d7b1486d323835fb43e4195826a4599 | |
parent | e9684fac5a158be9806304a676e619857520a4dc (diff) | |
download | cpython-a97011b9b8c8111f42e1e7594081956136d848da.zip cpython-a97011b9b8c8111f42e1e7594081956136d848da.tar.gz cpython-a97011b9b8c8111f42e1e7594081956136d848da.tar.bz2 |
bpo-39593: Add test on ctypes cfield.c s_set() (GH-18424)
-rw-r--r-- | Lib/ctypes/test/test_struct_fields.py | 8 | ||||
-rw-r--r-- | Modules/_ctypes/cfield.c | 4 |
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. |