[Python-checkins] python/dist/src/Objects unicodeobject.c,2.142,2.143

tim_one@sourceforge.net tim_one@sourceforge.net
Sun, 21 Apr 2002 10:28:09 -0700


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;