diff options
author | Mark Dickinson <dickinsm@gmail.com> | 2010-01-29 17:27:24 (GMT) |
---|---|---|
committer | Mark Dickinson <dickinsm@gmail.com> | 2010-01-29 17:27:24 (GMT) |
commit | bc09964be115a81e6324dbea5b5fc049759e9430 (patch) | |
tree | b58af14e0ed48291a828a07307a28b1c114d9931 | |
parent | 8b441d0dcdb9380e999f0caead087c4365cb0bdd (diff) | |
download | cpython-bc09964be115a81e6324dbea5b5fc049759e9430.zip cpython-bc09964be115a81e6324dbea5b5fc049759e9430.tar.gz cpython-bc09964be115a81e6324dbea5b5fc049759e9430.tar.bz2 |
Merged revisions 77821 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r77821 | mark.dickinson | 2010-01-29 17:11:39 +0000 (Fri, 29 Jan 2010) | 3 lines
Issue #7788: Fix a crash produced by deleting a list slice with huge
step value. Patch by Marcin Bachry.
........
-rw-r--r-- | Lib/test/list_tests.py | 3 | ||||
-rwxr-xr-x | Lib/test/test_array.py | 3 | ||||
-rw-r--r-- | Lib/test/test_bytes.py | 2 | ||||
-rw-r--r-- | Misc/NEWS | 3 | ||||
-rw-r--r-- | Modules/arraymodule.c | 5 | ||||
-rw-r--r-- | Objects/bytearrayobject.c | 3 | ||||
-rw-r--r-- | Objects/listobject.c | 3 |
7 files changed, 17 insertions, 5 deletions
diff --git a/Lib/test/list_tests.py b/Lib/test/list_tests.py index 67492f3..e2889cc 100644 --- a/Lib/test/list_tests.py +++ b/Lib/test/list_tests.py @@ -540,6 +540,9 @@ class CommonTest(seq_tests.CommonTest): a = self.type2test(range(10)) a[::2] = tuple(range(5)) self.assertEqual(a, self.type2test([0, 1, 1, 3, 2, 5, 3, 7, 4, 9])) + # test issue7788 + a = self.type2test(range(10)) + del a[9::1<<333] def test_constructor_exception_handling(self): # Bug #1242657 diff --git a/Lib/test/test_array.py b/Lib/test/test_array.py index 6ec9bb3..8a3796c 100755 --- a/Lib/test/test_array.py +++ b/Lib/test/test_array.py @@ -1011,6 +1011,9 @@ class NumberTest(BaseTest): a = array.array(self.typecode, range(10)) del a[::1000] self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9])) + # test issue7788 + a = array.array(self.typecode, range(10)) + del a[9::1<<333] def test_assignment(self): a = array.array(self.typecode, range(10)) diff --git a/Lib/test/test_bytes.py b/Lib/test/test_bytes.py index 73f7c02..0af0685 100644 --- a/Lib/test/test_bytes.py +++ b/Lib/test/test_bytes.py @@ -600,7 +600,7 @@ class ByteArrayTest(BaseBytesTest): self.assertEqual(b, bytearray([0, 1, 2, 42, 42, 42, 3, 4, 5, 6, 7, 8, 9])) def test_extended_set_del_slice(self): - indices = (0, None, 1, 3, 19, 300, -1, -2, -31, -300) + indices = (0, None, 1, 3, 19, 300, 1<<333, -1, -2, -31, -300) for start in indices: for stop in indices: # Skip invalid step 0 @@ -12,6 +12,9 @@ What's New in Python 3.2 Alpha 1? Core and Builtins ----------------- +- Issue #7788: Fix an interpreter crash produced by deleting a list + slice with very large step value. + - Issue #7766: Change sys.getwindowsversion() return value to a named tuple and add the additional members returned in an OSVERSIONINFOEX structure. The new members are service_pack_major, service_pack_minor, diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c index 4791890..e396716 100644 --- a/Modules/arraymodule.c +++ b/Modules/arraymodule.c @@ -2199,8 +2199,9 @@ array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value) } else if (needed == 0) { /* Delete slice */ - Py_ssize_t cur, i; - + size_t cur; + Py_ssize_t i; + if (step < 0) { stop = start + 1; start = stop + step * (slicelength - 1) - 1; diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c index 3603d4f..42f1ed6 100644 --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -642,7 +642,8 @@ bytearray_ass_subscript(PyByteArrayObject *self, PyObject *index, PyObject *valu else { if (needed == 0) { /* Delete slice */ - Py_ssize_t cur, i; + size_t cur; + Py_ssize_t i; if (!_canresize(self)) return -1; diff --git a/Objects/listobject.c b/Objects/listobject.c index f54b97d..a97d475 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -2444,7 +2444,8 @@ list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value) if (value == NULL) { /* delete slice */ PyObject **garbage; - Py_ssize_t cur, i; + size_t cur; + Py_ssize_t i; if (slicelength <= 0) return 0; |