diff -r -U 4 python2.5-2.5.orig/Lib/test/seq_tests.py python2.5-bigrepeat/Lib/test/seq_tests.py --- python2.5-2.5.orig/Lib/test/seq_tests.py 2005-08-26 10:20:46.000000000 -0500 +++ python2.5-bigrepeat/Lib/test/seq_tests.py 2007-05-16 09:41:23.716222544 -0500 @@ -304,9 +304,17 @@ for n in xrange(-3, 5): self.assertEqual(self.type2test(s*n), self.type2test(s)*n) self.assertEqual(self.type2test(s)*(-4), self.type2test([])) self.assertEqual(id(s), id(s*1)) - + + def test_bigrepeat(self): + x = self.type2test([0]) + x *= 2**16 + self.assertRaises(MemoryError, x.__mul__, 2**16) + if hasattr(x, '__imul__'): + self.assertRais + es(MemoryError, x.__imul__, 2**16) + def test_subscript(self): a = self.type2test([10, 11]) self.assertEqual(a.__getitem__(0L), 10) self.assertEqual(a.__getitem__(1L), 11) diff -r -U 4 python2.5-2.5.orig/Objects/listobject.c python2.5-bigrepeat/Objects/listobject.c --- python2.5-2.5.orig/Objects/listobject.c 2006-08-12 12:03:09.000000000 -0500 +++ python2.5-bigrepeat/Objects/listobject.c 2007-05-16 08:55:49.945818816 -0500 @@ -478,21 +478,21 @@ static PyObject * list_repeat(PyListObject *a, Py_ssize_t n) { - Py_ssize_t i, j; - Py_ssize_t size; + Py_ssize_t i, j, d; PyListObject *np; PyObject **p, **items; PyObject *elem; - if (n < 0) - n = 0; - size = a->ob_size * n; - if (size == 0) + + if (n <= 0 || a->ob_size == 0) return PyList_New(0); - if (n && size/n != a->ob_size) - return PyErr_NoMemory(); - np = (PyListObject *) PyList_New(size); + + d = PY_SSIZE_T_MAX / a->ob_size; + if (n > d) + return PyErr_NoMemory(); + + np = (PyListObject *) PyList_New(a->ob_size * n); if (np == NULL) return NULL; items = np->ob_item; @@ -656,9 +656,9 @@ static PyObject * list_inplace_repeat(PyListObject *self, Py_ssize_t n) { PyObject **items; - Py_ssize_t size, i, j, p; + Py_ssize_t size, i, j, p, d; size = PyList_GET_SIZE(self); if (size == 0) { @@ -671,8 +671,12 @@ Py_INCREF(self); return (PyObject *)self; } + d = PY_SSIZE_T_MAX / size; + if (n > d) + return PyErr_NoMemory(); + if (list_resize(self, size*n) == -1) return NULL; p = size;