# HG changeset patch # Parent 89821243621b2ebf7aa38143e813c2cc76739fff Issue #1621: Avoid signed int overflow when iterating over slices diff -r 89821243621b Lib/ctypes/test/test_arrays.py --- a/Lib/ctypes/test/test_arrays.py Thu Jul 14 07:45:24 2016 +0300 +++ b/Lib/ctypes/test/test_arrays.py Tue Jul 19 03:13:47 2016 +0000 @@ -1,3 +1,4 @@ +import sys import unittest from ctypes import * @@ -67,6 +68,17 @@ from operator import delitem self.assertRaises(TypeError, delitem, ca, 0) + def test_step_overflow(self): + a = (c_int * 5)() + a[3::sys.maxsize] = (1,) + self.assertListEqual(a[3::sys.maxsize], [1]) + a = (c_char * 5)() + a[3::sys.maxsize] = b"A" + self.assertEqual(a[3::sys.maxsize], b"A") + a = (c_wchar * 5)() + a[3::sys.maxsize] = u"X" + self.assertEqual(a[3::sys.maxsize], u"X") + def test_numeric_arrays(self): alen = 5 @@ -161,8 +173,6 @@ self.assertEqual(Y()._length_, 187) def test_bad_subclass(self): - import sys - with self.assertRaises(AttributeError): class T(Array): pass diff -r 89821243621b Lib/test/seq_tests.py --- a/Lib/test/seq_tests.py Thu Jul 14 07:45:24 2016 +0300 +++ b/Lib/test/seq_tests.py Tue Jul 19 03:13:47 2016 +0000 @@ -209,6 +209,7 @@ a = self.type2test([0,1,2,3,4]) self.assertEqual(a[ -pow(2,128): 3 ], self.type2test([0,1,2])) self.assertEqual(a[ 3: pow(2,145) ], self.type2test([3,4])) + self.assertEqual(a[3::sys.maxsize], self.type2test([3])) def test_contains(self): u = self.type2test([0, 1, 2]) diff -r 89821243621b Lib/test/string_tests.py --- a/Lib/test/string_tests.py Thu Jul 14 07:45:24 2016 +0300 +++ b/Lib/test/string_tests.py Tue Jul 19 03:13:47 2016 +0000 @@ -1120,7 +1120,7 @@ def test_extended_getslice(self): # Test extended slicing by comparing with list slicing. s = string.ascii_letters + string.digits - indices = (0, None, 1, 3, 41, -1, -2, -37) + indices = (0, None, 1, 3, 41, -1, -2, -37, sys.maxsize) for start in indices: for stop in indices: # Skip step 0 (invalid) diff -r 89821243621b Lib/test/test_array.py --- a/Lib/test/test_array.py Thu Jul 14 07:45:24 2016 +0300 +++ b/Lib/test/test_array.py Tue Jul 19 03:13:47 2016 +0000 @@ -745,7 +745,7 @@ # Test extended slicing by comparing with list slicing # (Assumes list conversion works correctly, too) a = array.array(self.typecode, self.example) - indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100) + indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100, sys.maxsize) for start in indices: for stop in indices: # Everything except the initial 0 (invalid step) @@ -843,7 +843,7 @@ self.assertRaises(TypeError, a.__setitem__, slice(0, 1), b) def test_extended_set_del_slice(self): - indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100) + indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100, sys.maxsize) for start in indices: for stop in indices: # Everything except the initial 0 (invalid step) diff -r 89821243621b Lib/test/test_bytes.py --- a/Lib/test/test_bytes.py Thu Jul 14 07:45:24 2016 +0300 +++ b/Lib/test/test_bytes.py Tue Jul 19 03:13:47 2016 +0000 @@ -199,7 +199,7 @@ # Test extended slicing by comparing with list slicing. L = list(range(255)) b = self.type2test(L) - indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100) + indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100, sys.maxsize) for start in indices: for stop in indices: # Skip step 0 (invalid) @@ -1046,7 +1046,8 @@ self.assertLessEqual(sys.getsizeof(b), size) def test_extended_set_del_slice(self): - indices = (0, None, 1, 3, 19, 300, 1<<333, -1, -2, -31, -300) + indices = (0, None, 1, 3, 19, 300, 1<<333, sys.maxsize, + -1, -2, -31, -300) for start in indices: for stop in indices: # Skip invalid step 0 diff -r 89821243621b Lib/test/test_mmap.py --- a/Lib/test/test_mmap.py Thu Jul 14 07:45:24 2016 +0300 +++ b/Lib/test/test_mmap.py Tue Jul 19 03:13:47 2016 +0000 @@ -452,7 +452,7 @@ m = mmap.mmap(-1, len(s)) m[:] = s self.assertEqual(m[:], s) - indices = (0, None, 1, 3, 19, 300, -1, -2, -31, -300) + indices = (0, None, 1, 3, 19, 300, -1, -2, -31, -300, sys.maxsize) for start in indices: for stop in indices: # Skip step 0 (invalid) @@ -464,7 +464,7 @@ # Test extended slicing by comparing with list slicing. s = bytes(reversed(range(256))) m = mmap.mmap(-1, len(s)) - indices = (0, None, 1, 3, 19, 300, -1, -2, -31, -300) + indices = (0, None, 1, 3, 19, 300, -1, -2, -31, -300, sys.maxsize) for start in indices: for stop in indices: # Skip invalid step 0 diff -r 89821243621b Modules/_ctypes/_ctypes.c --- a/Modules/_ctypes/_ctypes.c Thu Jul 14 07:45:24 2016 +0300 +++ b/Modules/_ctypes/_ctypes.c Tue Jul 19 03:13:47 2016 +0000 @@ -4270,7 +4270,8 @@ StgDictObject *stgdict, *itemdict; PyObject *proto; PyObject *np; - Py_ssize_t start, stop, step, slicelen, cur, i; + Py_ssize_t start, stop, step, slicelen, i; + size_t cur; if (PySlice_GetIndicesEx(item, self->b_length, &start, &stop, @@ -4411,7 +4412,8 @@ return Array_ass_item(myself, i, value); } else if (PySlice_Check(item)) { - Py_ssize_t start, stop, step, slicelen, otherlen, i, cur; + Py_ssize_t start, stop, step, slicelen, otherlen, i; + size_t cur; if (PySlice_GetIndicesEx(item, self->b_length, &start, &stop, diff -r 89821243621b Modules/_elementtree.c --- a/Modules/_elementtree.c Thu Jul 14 07:45:24 2016 +0300 +++ b/Modules/_elementtree.c Tue Jul 19 03:13:47 2016 +0000 @@ -1706,7 +1706,8 @@ return element_getitem(self_, i); } else if (PySlice_Check(item)) { - Py_ssize_t start, stop, step, slicelen, cur, i; + Py_ssize_t start, stop, step, slicelen, i; + size_t cur; PyObject* list; if (!self->extra) @@ -1758,7 +1759,8 @@ return element_setitem(self_, i, value); } else if (PySlice_Check(item)) { - Py_ssize_t start, stop, step, slicelen, newlen, cur, i; + Py_ssize_t start, stop, step, slicelen, newlen, i; + size_t cur; PyObject* recycle = NULL; PyObject* seq; diff -r 89821243621b Modules/arraymodule.c --- a/Modules/arraymodule.c Thu Jul 14 07:45:24 2016 +0300 +++ b/Modules/arraymodule.c Tue Jul 19 03:13:47 2016 +0000 @@ -2314,7 +2314,8 @@ return array_item(self, i); } else if (PySlice_Check(item)) { - Py_ssize_t start, stop, step, slicelength, cur, i; + Py_ssize_t start, stop, step, slicelength, i; + size_t cur; PyObject* result; arrayobject* ar; int itemsize = self->ob_descr->itemsize; @@ -2497,7 +2498,8 @@ return 0; } else { - Py_ssize_t cur, i; + size_t cur; + Py_ssize_t i; if (needed != slicelength) { PyErr_Format(PyExc_ValueError, diff -r 89821243621b Modules/mmapmodule.c --- a/Modules/mmapmodule.c Thu Jul 14 07:45:24 2016 +0300 +++ b/Modules/mmapmodule.c Tue Jul 19 03:13:47 2016 +0000 @@ -825,7 +825,8 @@ slicelen); else { char *result_buf = (char *)PyMem_Malloc(slicelen); - Py_ssize_t cur, i; + size_t cur; + Py_ssize_t i; PyObject *result; if (result_buf == NULL) @@ -964,7 +965,8 @@ memcpy(self->data + start, vbuf.buf, slicelen); } else { - Py_ssize_t cur, i; + size_t cur; + Py_ssize_t i; for (cur = start, i = 0; i < slicelen; diff -r 89821243621b Objects/bytearrayobject.c --- a/Objects/bytearrayobject.c Thu Jul 14 07:45:24 2016 +0300 +++ b/Objects/bytearrayobject.c Tue Jul 19 03:13:47 2016 +0000 @@ -399,7 +399,8 @@ return PyLong_FromLong((unsigned char)(PyByteArray_AS_STRING(self)[i])); } else if (PySlice_Check(index)) { - Py_ssize_t start, stop, step, slicelength, cur, i; + Py_ssize_t start, stop, step, slicelength, i; + size_t cur; if (PySlice_GetIndicesEx(index, PyByteArray_GET_SIZE(self), &start, &stop, &step, &slicelength) < 0) { diff -r 89821243621b Objects/bytesobject.c --- a/Objects/bytesobject.c Thu Jul 14 07:45:24 2016 +0300 +++ b/Objects/bytesobject.c Tue Jul 19 03:13:47 2016 +0000 @@ -1636,7 +1636,8 @@ return PyLong_FromLong((unsigned char)self->ob_sval[i]); } else if (PySlice_Check(item)) { - Py_ssize_t start, stop, step, slicelength, cur, i; + Py_ssize_t start, stop, step, slicelength, i; + size_t cur; char* source_buf; char* result_buf; PyObject* result; diff -r 89821243621b Objects/tupleobject.c --- a/Objects/tupleobject.c Thu Jul 14 07:45:24 2016 +0300 +++ b/Objects/tupleobject.c Tue Jul 19 03:13:47 2016 +0000 @@ -715,7 +715,8 @@ return tupleitem(self, i); } else if (PySlice_Check(item)) { - Py_ssize_t start, stop, step, slicelength, cur, i; + Py_ssize_t start, stop, step, slicelength, i; + size_t cur; PyObject* result; PyObject* it; PyObject **src, **dest; diff -r 89821243621b Objects/unicodeobject.c --- a/Objects/unicodeobject.c Thu Jul 14 07:45:24 2016 +0300 +++ b/Objects/unicodeobject.c Tue Jul 19 03:13:47 2016 +0000 @@ -13748,7 +13748,8 @@ i += PyUnicode_GET_LENGTH(self); return unicode_getitem(self, i); } else if (PySlice_Check(item)) { - Py_ssize_t start, stop, step, slicelength, cur, i; + Py_ssize_t start, stop, step, slicelength, i; + size_t cur; PyObject *result; void *src_data, *dest_data; int src_kind, dest_kind;