[Python-checkins] python/dist/src/Objects stringobject.c,2.193,2.194 unicodeobject.c,2.171,2.172
gvanrossum@users.sourceforge.net
gvanrossum@users.sourceforge.net
Thu, 10 Oct 2002 17:43:50 -0700
Update of /cvsroot/python/python/dist/src/Objects
In directory usw-pr-cvs1:/tmp/cvs-serv19831
Modified Files:
stringobject.c unicodeobject.c
Log Message:
Fix a nasty endcase reported by Armin Rigo in SF bug 618623:
'%2147483647d' % -123 segfaults. This was because an integer overflow
in a comparison caused the string resize to be skipped. After fixing
the overflow, this could call _PyString_Resize() with a negative size,
so I (1) test for that and raise MemoryError instead; (2) also added a
test for negative newsize to _PyString_Resize(), raising SystemError
as for all bad arguments.
An identical bug existed in unicodeobject.c, of course.
Will backport to 2.2.2.
Index: stringobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/stringobject.c,v
retrieving revision 2.193
retrieving revision 2.194
diff -C2 -d -r2.193 -r2.194
*** stringobject.c 9 Oct 2002 19:14:30 -0000 2.193
--- stringobject.c 11 Oct 2002 00:43:48 -0000 2.194
***************
*** 3320,3324 ****
register PyStringObject *sv;
v = *pv;
! if (!PyString_Check(v) || v->ob_refcnt != 1) {
*pv = 0;
Py_DECREF(v);
--- 3320,3324 ----
register PyStringObject *sv;
v = *pv;
! if (!PyString_Check(v) || v->ob_refcnt != 1 || newsize < 0) {
*pv = 0;
Py_DECREF(v);
***************
*** 3960,3967 ****
if (width < len)
width = len;
! if (rescnt < width + (sign != 0)) {
reslen -= rescnt;
rescnt = width + fmtcnt + 100;
reslen += rescnt;
if (_PyString_Resize(&result, reslen) < 0)
return NULL;
--- 3960,3971 ----
if (width < len)
width = len;
! if (rescnt - (sign != 0) < width) {
reslen -= rescnt;
rescnt = width + fmtcnt + 100;
reslen += rescnt;
+ if (reslen < 0) {
+ Py_DECREF(result);
+ return PyErr_NoMemory();
+ }
if (_PyString_Resize(&result, reslen) < 0)
return NULL;
Index: unicodeobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/unicodeobject.c,v
retrieving revision 2.171
retrieving revision 2.172
diff -C2 -d -r2.171 -r2.172
*** unicodeobject.c 24 Sep 2002 09:32:14 -0000 2.171
--- unicodeobject.c 11 Oct 2002 00:43:48 -0000 2.172
***************
*** 262,266 ****
}
v = (PyUnicodeObject *)*unicode;
! if (v == NULL || !PyUnicode_Check(v) || v->ob_refcnt != 1) {
PyErr_BadInternalCall();
return -1;
--- 262,266 ----
}
v = (PyUnicodeObject *)*unicode;
! if (v == NULL || !PyUnicode_Check(v) || v->ob_refcnt != 1 || length < 0) {
PyErr_BadInternalCall();
return -1;
***************
*** 6484,6491 ****
if (width < len)
width = len;
! if (rescnt < width + (sign != 0)) {
reslen -= rescnt;
rescnt = width + fmtcnt + 100;
reslen += rescnt;
if (_PyUnicode_Resize(&result, reslen) < 0)
return NULL;
--- 6484,6495 ----
if (width < len)
width = len;
! if (rescnt - (sign != 0) < width) {
reslen -= rescnt;
rescnt = width + fmtcnt + 100;
reslen += rescnt;
+ if (reslen < 0) {
+ Py_DECREF(result);
+ return PyErr_NoMemory();
+ }
if (_PyUnicode_Resize(&result, reslen) < 0)
return NULL;