Fix a bug when there was a newline in the string expandtabs was called on.

This also catches another condition that can overflow.

Will backport.
This commit is contained in:
Neal Norwitz 2007-06-11 02:16:10 +00:00
parent ba965deea8
commit 5c9a81a3d8
3 changed files with 21 additions and 4 deletions

View File

@ -247,8 +247,13 @@ class CommonTest(unittest.TestCase):
self.checkequal('abc\rab def\ng hi', 'abc\rab\tdef\ng\thi', 'expandtabs') self.checkequal('abc\rab def\ng hi', 'abc\rab\tdef\ng\thi', 'expandtabs')
self.checkequal('abc\rab def\ng hi', 'abc\rab\tdef\ng\thi', 'expandtabs', 8) self.checkequal('abc\rab def\ng hi', 'abc\rab\tdef\ng\thi', 'expandtabs', 8)
self.checkequal('abc\r\nab\r\ndef\ng\r\nhi', 'abc\r\nab\r\ndef\ng\r\nhi', 'expandtabs', 4) self.checkequal('abc\r\nab\r\ndef\ng\r\nhi', 'abc\r\nab\r\ndef\ng\r\nhi', 'expandtabs', 4)
self.checkequal(' a\n b', ' \ta\n\tb', 'expandtabs', 1)
self.checkraises(TypeError, 'hello', 'expandtabs', 42, 42) self.checkraises(TypeError, 'hello', 'expandtabs', 42, 42)
# This test is only valid when sizeof(int) == sizeof(void*) == 4.
if sys.maxint < (1 << 32) and struct.calcsize('P') == 4:
self.checkraises(OverflowError,
'\ta\n\tb', 'expandtabs', sys.maxint)
def test_split(self): def test_split(self):
self.checkequal(['this', 'is', 'the', 'split', 'function'], self.checkequal(['this', 'is', 'the', 'split', 'function'],

View File

@ -3322,7 +3322,8 @@ string_expandtabs(PyStringObject *self, PyObject *args)
if (tabsize > 0) { if (tabsize > 0) {
j += tabsize - (j % tabsize); j += tabsize - (j % tabsize);
if (old_j > j) { if (old_j > j) {
PyErr_SetString(PyExc_OverflowError, "new string is too long"); PyErr_SetString(PyExc_OverflowError,
"new string is too long");
return NULL; return NULL;
} }
old_j = j; old_j = j;
@ -3332,7 +3333,12 @@ string_expandtabs(PyStringObject *self, PyObject *args)
j++; j++;
if (*p == '\n' || *p == '\r') { if (*p == '\n' || *p == '\r') {
i += j; i += j;
j = 0; old_j = j = 0;
if (i < 0) {
PyErr_SetString(PyExc_OverflowError,
"new string is too long");
return NULL;
}
} }
} }

View File

@ -5705,7 +5705,8 @@ unicode_expandtabs(PyUnicodeObject *self, PyObject *args)
if (tabsize > 0) { if (tabsize > 0) {
j += tabsize - (j % tabsize); j += tabsize - (j % tabsize);
if (old_j > j) { if (old_j > j) {
PyErr_SetString(PyExc_OverflowError, "new string is too long"); PyErr_SetString(PyExc_OverflowError,
"new string is too long");
return NULL; return NULL;
} }
old_j = j; old_j = j;
@ -5715,7 +5716,12 @@ unicode_expandtabs(PyUnicodeObject *self, PyObject *args)
j++; j++;
if (*p == '\n' || *p == '\r') { if (*p == '\n' || *p == '\r') {
i += j; i += j;
j = 0; old_j = j = 0;
if (i < 0) {
PyErr_SetString(PyExc_OverflowError,
"new string is too long");
return NULL;
}
} }
} }