Mailing List Archive

python/dist/src/Objects unicodeobject.c,2.142,2.143
Update of /cvsroot/python/python/dist/src/Objects
In directory usw-pr-cvs1:/tmp/cvs-serv412/python/Objects

Modified Files:
unicodeobject.c
Log Message:
PyUnicode_EncodeUTF8(): tightened the memory asserts a bit, and at least
tried to catch some possible arithmetic overflows in the debug build.


Index: unicodeobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/unicodeobject.c,v
retrieving revision 2.142
retrieving revision 2.143
diff -C2 -d -r2.142 -r2.143
*** unicodeobject.c 21 Apr 2002 09:59:45 -0000 2.142
--- unicodeobject.c 21 Apr 2002 17:28:06 -0000 2.143
***************
*** 1186,1198 ****
PyObject *v;
char *p;
- int i = 0;
- int overalloc = 2;
int len;
!
! /* Short-cut for emtpy strings */
if (size == 0)
return PyString_FromStringAndSize(NULL, 0);

! v = PyString_FromStringAndSize(NULL, overalloc * size);
if (v == NULL)
return NULL;
--- 1186,1200 ----
PyObject *v;
char *p;
int len;
! int i = 0;
! long overalloc = 2;
! int nallocated; /* overalloc * size; PyString_ adds one more for \0 */
!
! /* Short-cut for empty strings */
if (size == 0)
return PyString_FromStringAndSize(NULL, 0);

! nallocated = Py_SAFE_DOWNCAST(overalloc * size, long, int);
! v = PyString_FromStringAndSize(NULL, nallocated);
if (v == NULL)
return NULL;
***************
*** 1212,1216 ****
*p++ = (char)(0x80 | (ch & 0x3f));
}
!
else {
/* Encode UCS2 Unicode ordinals */
--- 1214,1218 ----
*p++ = (char)(0x80 | (ch & 0x3f));
}
!
else {
/* Encode UCS2 Unicode ordinals */
***************
*** 1231,1237 ****

if (overalloc < 3) {
! len = (int)(p - PyString_AS_STRING(v));
overalloc = 3;
! if (_PyString_Resize(&v, overalloc * size))
goto onError;
p = PyString_AS_STRING(v) + len;
--- 1233,1241 ----

if (overalloc < 3) {
! len = Py_SAFE_DOWNCAST(p-PyString_AS_STRING(v), long, int);
! assert(len <= nallocated);
overalloc = 3;
! nallocated = Py_SAFE_DOWNCAST(overalloc * size, long, int);
! if (_PyString_Resize(&v, nallocated))
goto onError;
p = PyString_AS_STRING(v) + len;
***************
*** 1246,1252 ****
encodeUCS4:
if (overalloc < 4) {
! len = (int)(p - PyString_AS_STRING(v));
overalloc = 4;
! if (_PyString_Resize(&v, overalloc * size))
goto onError;
p = PyString_AS_STRING(v) + len;
--- 1250,1258 ----
encodeUCS4:
if (overalloc < 4) {
! len = Py_SAFE_DOWNCAST(p - PyString_AS_STRING(v), long, int);
! assert(len <= nallocated);
overalloc = 4;
! nallocated = Py_SAFE_DOWNCAST(overalloc * size, long, int);
! if (_PyString_Resize(&v, nallocated))
goto onError;
p = PyString_AS_STRING(v) + len;
***************
*** 1258,1264 ****
}
}
*p = '\0';
! assert((p - PyString_AS_STRING(v)) <= overalloc*size);
! if (_PyString_Resize(&v, (int)(p - PyString_AS_STRING(v))))
goto onError;
return v;
--- 1264,1272 ----
}
}
+
*p = '\0';
! len = Py_SAFE_DOWNCAST(p - PyString_AS_STRING(v), long, int);
! assert(len <= nallocated);
! if (_PyString_Resize(&v, len))
goto onError;
return v;