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:
Tim Peters 2002-04-21 17:28:06 +00:00
parent 0e0ee598fc
commit 0eca65c4c5

View file

@ -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;