diff --git a/Modules/_testlimitedcapi/unicode.c b/Modules/_testlimitedcapi/unicode.c index 7fdb3d08a34184..5328cba49c2b03 100644 --- a/Modules/_testlimitedcapi/unicode.c +++ b/Modules/_testlimitedcapi/unicode.c @@ -1850,11 +1850,33 @@ unicode_export(PyObject *self, PyObject *args) Py_ssize_t size; uint32_t format; - const void *data = PyUnicode_Export(obj, requested_formats, &size, &format); + const char *data = PyUnicode_Export(obj, requested_formats, &size, &format); if (data == NULL) { return NULL; } + // Make sure that the exported string ends with a NUL character + switch (format) + { + case PyUnicode_FORMAT_ASCII: + case PyUnicode_FORMAT_UCS1: + assert(data[size] == 0); + break; + case PyUnicode_FORMAT_UCS2: + assert(data[size] == 0); + assert(data[size+1] == 0); + break; + case PyUnicode_FORMAT_UCS4: + assert(data[size] == 0); + assert(data[size+1] == 0); + assert(data[size+2] == 0); + assert(data[size+3] == 0); + break; + case PyUnicode_FORMAT_UTF8: + assert(data[size] == 0); + break; + } + PyObject *res = Py_BuildValue("y#I", data, size, (unsigned int)format); PyUnicode_ReleaseExport(obj, data, format); return res;