diff -r 6c2e2de5ab8e Objects/listobject.c --- a/Objects/listobject.c Sat Jul 30 23:51:13 2016 -0700 +++ b/Objects/listobject.c Wed Aug 03 00:22:35 2016 +0800 @@ -47,23 +47,17 @@ * The growth pattern is: 0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ... */ new_allocated = (newsize >> 3) + (newsize < 9 ? 3 : 6); - - /* check for integer overflow */ - if (new_allocated > PY_SIZE_MAX - newsize) { + /* can't overflow, largest number is PY_SSIZE_T_MAX * (9 / 8) + 6 */ + new_allocated += (size_t)newsize; + if (new_allocated > (size_t)PY_SSIZE_T_MAX) { PyErr_NoMemory(); return -1; - } else { - new_allocated += newsize; } if (newsize == 0) new_allocated = 0; items = self->ob_item; - if (new_allocated <= (PY_SIZE_MAX / sizeof(PyObject *))) - PyMem_RESIZE(items, PyObject *, new_allocated); - else - items = NULL; - if (items == NULL) { + if (!PyMem_RESIZE(items, PyObject *, new_allocated)) { PyErr_NoMemory(); return -1; }