Backport issue #12973 list_repeat fix from 3.x.

This commit is contained in:
Mark Dickinson 2011-09-19 19:23:55 +01:00
parent dbbed04941
commit 4ac5d2cda4
2 changed files with 6 additions and 4 deletions

View File

@ -12,7 +12,9 @@ Core and Builtins
- Issue #12973: Fix overflow checks that invoked undefined behaviour in - Issue #12973: Fix overflow checks that invoked undefined behaviour in
int.__pow__. These overflow checks were causing int.__pow__ to produce int.__pow__. These overflow checks were causing int.__pow__ to produce
incorrect results with recent versions of Clang, as a result of the incorrect results with recent versions of Clang, as a result of the
compiler optimizing the check away. compiler optimizing the check away. Also fix similar overflow check
in list_repeat (which caused test_list to fail with recent versions
of Clang).
- Issue #12266: Fix str.capitalize() to correctly uppercase/lowercase - Issue #12266: Fix str.capitalize() to correctly uppercase/lowercase
titlecased and cased non-letter characters. titlecased and cased non-letter characters.

View File

@ -58,7 +58,7 @@ list_resize(PyListObject *self, Py_ssize_t newsize)
if (newsize == 0) if (newsize == 0)
new_allocated = 0; new_allocated = 0;
items = self->ob_item; items = self->ob_item;
if (new_allocated <= ((~(size_t)0) / sizeof(PyObject *))) if (new_allocated <= (PY_SIZE_MAX / sizeof(PyObject *)))
PyMem_RESIZE(items, PyObject *, new_allocated); PyMem_RESIZE(items, PyObject *, new_allocated);
else else
items = NULL; items = NULL;
@ -551,9 +551,9 @@ list_repeat(PyListObject *a, Py_ssize_t n)
PyObject *elem; PyObject *elem;
if (n < 0) if (n < 0)
n = 0; n = 0;
size = Py_SIZE(a) * n; if (n > 0 && Py_SIZE(a) > PY_SSIZE_T_MAX / n)
if (n && size/n != Py_SIZE(a))
return PyErr_NoMemory(); return PyErr_NoMemory();
size = Py_SIZE(a) * n;
if (size == 0) if (size == 0)
return PyList_New(0); return PyList_New(0);
np = (PyListObject *) PyList_New(size); np = (PyListObject *) PyList_New(size);