mirror of
https://github.com/python/cpython.git
synced 2025-10-21 14:12:27 +00:00
PyUnicode_Join() checks output length in debug mode
PyUnicode_CopyCharacters() may copies less character than requested size, if the input string is smaller than the argument. (This is very unlikely, but who knows!?) Avoid also calling PyUnicode_CopyCharacters() if the string is empty.
This commit is contained in:
parent
b803895355
commit
9ce5a835bb
1 changed files with 21 additions and 9 deletions
|
@ -8890,20 +8890,32 @@ PyUnicode_Join(PyObject *separator, PyObject *seq)
|
|||
|
||||
/* Catenate everything. */
|
||||
for (i = 0, res_offset = 0; i < seqlen; ++i) {
|
||||
Py_ssize_t itemlen;
|
||||
Py_ssize_t itemlen, copied;
|
||||
item = items[i];
|
||||
itemlen = PyUnicode_GET_LENGTH(item);
|
||||
/* Copy item, and maybe the separator. */
|
||||
if (i) {
|
||||
if (PyUnicode_CopyCharacters(res, res_offset,
|
||||
sep, 0, seplen) < 0)
|
||||
if (i && seplen != 0) {
|
||||
copied = PyUnicode_CopyCharacters(res, res_offset,
|
||||
sep, 0, seplen);
|
||||
if (copied < 0)
|
||||
goto onError;
|
||||
#ifdef Py_DEBUG
|
||||
res_offset += copied;
|
||||
#else
|
||||
res_offset += seplen;
|
||||
#endif
|
||||
}
|
||||
itemlen = PyUnicode_GET_LENGTH(item);
|
||||
if (itemlen != 0) {
|
||||
copied = PyUnicode_CopyCharacters(res, res_offset,
|
||||
item, 0, itemlen);
|
||||
if (copied < 0)
|
||||
goto onError;
|
||||
#ifdef Py_DEBUG
|
||||
res_offset += copied;
|
||||
#else
|
||||
res_offset += itemlen;
|
||||
#endif
|
||||
}
|
||||
if (PyUnicode_CopyCharacters(res, res_offset,
|
||||
item, 0, itemlen) < 0)
|
||||
goto onError;
|
||||
res_offset += itemlen;
|
||||
}
|
||||
assert(res_offset == PyUnicode_GET_LENGTH(res));
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue