[Python-checkins] r74770 - in python/branches/release26-maint: Objects/longobject.c

mark.dickinson python-checkins at python.org
Sun Sep 13 13:59:42 CEST 2009


Author: mark.dickinson
Date: Sun Sep 13 13:59:41 2009
New Revision: 74770

Log:
Merged revisions 74769 via svnmerge from 
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r74769 | mark.dickinson | 2009-09-13 12:56:13 +0100 (Sun, 13 Sep 2009) | 3 lines
  
  Fix potential signed-overflow bug in _PyLong_Format;  also fix
  a couple of whitespace issues.
........


Modified:
   python/branches/release26-maint/   (props changed)
   python/branches/release26-maint/Objects/longobject.c

Modified: python/branches/release26-maint/Objects/longobject.c
==============================================================================
--- python/branches/release26-maint/Objects/longobject.c	(original)
+++ python/branches/release26-maint/Objects/longobject.c	Sun Sep 13 13:59:41 2009
@@ -1201,7 +1201,7 @@
 {
 	register PyLongObject *a = (PyLongObject *)aa;
 	PyStringObject *str;
-	Py_ssize_t i, j, sz;
+	Py_ssize_t i, sz;
 	Py_ssize_t size_a;
 	char *p;
 	int bits;
@@ -1222,20 +1222,21 @@
 		i >>= 1;
 	}
 	i = 5 + (addL ? 1 : 0);
-	j = size_a*PyLong_SHIFT + bits-1;
-	sz = i + j / bits;
-	if (j / PyLong_SHIFT < size_a || sz < i) {
+	/* ensure we don't get signed overflow in sz calculation */
+	if (size_a > (PY_SSIZE_T_MAX - i) / PyLong_SHIFT) {
 		PyErr_SetString(PyExc_OverflowError,
 				"long is too large to format");
 		return NULL;
 	}
+	sz = i + 1 + (size_a * PyLong_SHIFT - 1) / bits;
+	assert(sz >= 0);
 	str = (PyStringObject *) PyString_FromStringAndSize((char *)0, sz);
 	if (str == NULL)
 		return NULL;
 	p = PyString_AS_STRING(str) + sz;
 	*p = '\0';
-        if (addL)
-                *--p = 'L';
+	if (addL)
+		*--p = 'L';
 	if (a->ob_size < 0)
 		sign = '-';
 
@@ -1263,7 +1264,7 @@
 				accumbits -= basebits;
 				accum >>= basebits;
 			} while (i < size_a-1 ? accumbits >= basebits :
-					 	accum > 0);
+						accum > 0);
 		}
 	}
 	else {
@@ -1278,7 +1279,8 @@
 		int power = 1;
 		for (;;) {
 			unsigned long newpow = powbase * (unsigned long)base;
-			if (newpow >> PyLong_SHIFT)  /* doesn't fit in a digit */
+			if (newpow >> PyLong_SHIFT)
+				/* doesn't fit in a digit */
 				break;
 			powbase = (digit)newpow;
 			++power;
@@ -1328,7 +1330,7 @@
 		*--p = '0';
 	}
 	else if (base == 8) {
- 		if (newstyle) {
+		if (newstyle) {
 			*--p = 'o';
 			*--p = '0';
 		}


More information about the Python-checkins mailing list