diff Objects/unicodeobject.c @ 30446:a8a1bef407eb 2.3

Backport Tim's portability improvement and comments.
author Jeremy Hylton <jeremy@alum.mit.edu>
date Wed, 17 Sep 2003 03:22:27 +0000
parents 784e38abed82
children be0ca26ad574
line wrap: on
line diff
--- a/Objects/unicodeobject.c	Tue Sep 16 22:05:33 2003 +0000
+++ b/Objects/unicodeobject.c	Wed Sep 17 03:22:27 2003 +0000
@@ -132,7 +132,12 @@
        instead ! */
     if (unicode == unicode_empty || 
 	(unicode->length == 1 && 
-	 unicode->str[0] < 256U &&
+         /* MvL said unicode->str[] may be signed.  Python generally assumes
+          * an int contains at least 32 bits, and we don't use more than
+          * 32 bits even in a UCS4 build, so casting to unsigned int should
+          * be correct.
+          */
+	 (unsigned int)unicode->str[0] < 256U &&
 	 unicode_latin1[unicode->str[0]] == unicode)) {
         PyErr_SetString(PyExc_SystemError,
                         "can't resize shared unicode objects");
@@ -211,6 +216,13 @@
 	PyErr_NoMemory();
 	goto onError;
     }
+    /* Initialize the first element to guard against cases where
+     * the caller fails before initializing str -- unicode_resize()
+     * reads str[0], and the Keep-Alive optimization can keep memory
+     * allocated for str alive across a call to unicode_dealloc(unicode).
+     * We don't want unicode_resize to read uninitialized memory in
+     * that case.
+     */
     unicode->str[0] = 0;
     unicode->str[length] = 0;
     unicode->length = length;