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', 8)
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)
# 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):
self.checkequal(['this', 'is', 'the', 'split', 'function'],

View File

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