mirror of
https://github.com/python/cpython.git
synced 2025-08-27 12:16:04 +00:00
PyUnicode_EncodeUTF8(): tightened the memory asserts a bit, and at least
tried to catch some possible arithmetic overflows in the debug build.
This commit is contained in:
parent
0e0ee598fc
commit
0eca65c4c5
1 changed files with 20 additions and 12 deletions
|
@ -1185,15 +1185,17 @@ PyUnicode_EncodeUTF8(const Py_UNICODE *s,
|
||||||
{
|
{
|
||||||
PyObject *v;
|
PyObject *v;
|
||||||
char *p;
|
char *p;
|
||||||
int i = 0;
|
|
||||||
int overalloc = 2;
|
|
||||||
int len;
|
int len;
|
||||||
|
int i = 0;
|
||||||
|
long overalloc = 2;
|
||||||
|
int nallocated; /* overalloc * size; PyString_ adds one more for \0 */
|
||||||
|
|
||||||
/* Short-cut for emtpy strings */
|
/* Short-cut for empty strings */
|
||||||
if (size == 0)
|
if (size == 0)
|
||||||
return PyString_FromStringAndSize(NULL, 0);
|
return PyString_FromStringAndSize(NULL, 0);
|
||||||
|
|
||||||
v = PyString_FromStringAndSize(NULL, overalloc * size);
|
nallocated = Py_SAFE_DOWNCAST(overalloc * size, long, int);
|
||||||
|
v = PyString_FromStringAndSize(NULL, nallocated);
|
||||||
if (v == NULL)
|
if (v == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
@ -1230,9 +1232,11 @@ PyUnicode_EncodeUTF8(const Py_UNICODE *s,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (overalloc < 3) {
|
if (overalloc < 3) {
|
||||||
len = (int)(p - PyString_AS_STRING(v));
|
len = Py_SAFE_DOWNCAST(p-PyString_AS_STRING(v), long, int);
|
||||||
|
assert(len <= nallocated);
|
||||||
overalloc = 3;
|
overalloc = 3;
|
||||||
if (_PyString_Resize(&v, overalloc * size))
|
nallocated = Py_SAFE_DOWNCAST(overalloc * size, long, int);
|
||||||
|
if (_PyString_Resize(&v, nallocated))
|
||||||
goto onError;
|
goto onError;
|
||||||
p = PyString_AS_STRING(v) + len;
|
p = PyString_AS_STRING(v) + len;
|
||||||
}
|
}
|
||||||
|
@ -1245,9 +1249,11 @@ PyUnicode_EncodeUTF8(const Py_UNICODE *s,
|
||||||
/* Encode UCS4 Unicode ordinals */
|
/* Encode UCS4 Unicode ordinals */
|
||||||
encodeUCS4:
|
encodeUCS4:
|
||||||
if (overalloc < 4) {
|
if (overalloc < 4) {
|
||||||
len = (int)(p - PyString_AS_STRING(v));
|
len = Py_SAFE_DOWNCAST(p - PyString_AS_STRING(v), long, int);
|
||||||
|
assert(len <= nallocated);
|
||||||
overalloc = 4;
|
overalloc = 4;
|
||||||
if (_PyString_Resize(&v, overalloc * size))
|
nallocated = Py_SAFE_DOWNCAST(overalloc * size, long, int);
|
||||||
|
if (_PyString_Resize(&v, nallocated))
|
||||||
goto onError;
|
goto onError;
|
||||||
p = PyString_AS_STRING(v) + len;
|
p = PyString_AS_STRING(v) + len;
|
||||||
}
|
}
|
||||||
|
@ -1257,9 +1263,11 @@ PyUnicode_EncodeUTF8(const Py_UNICODE *s,
|
||||||
*p++ = (char)(0x80 | (ch & 0x3f));
|
*p++ = (char)(0x80 | (ch & 0x3f));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*p = '\0';
|
*p = '\0';
|
||||||
assert((p - PyString_AS_STRING(v)) <= overalloc*size);
|
len = Py_SAFE_DOWNCAST(p - PyString_AS_STRING(v), long, int);
|
||||||
if (_PyString_Resize(&v, (int)(p - PyString_AS_STRING(v))))
|
assert(len <= nallocated);
|
||||||
|
if (_PyString_Resize(&v, len))
|
||||||
goto onError;
|
goto onError;
|
||||||
return v;
|
return v;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue