Skip to content

Commit 4cee049

Browse files
authored
bpo-27660: remove unnecessary overflow checks in list_resize (GH-189)
1 parent 3e8d6cb commit 4cee049

File tree

1 file changed

+7
-12
lines changed

1 file changed

+7
-12
lines changed

Objects/listobject.c

+7-12
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ static int
2626
list_resize(PyListObject *self, Py_ssize_t newsize)
2727
{
2828
PyObject **items;
29-
size_t new_allocated;
29+
size_t new_allocated, num_allocated_bytes;
3030
Py_ssize_t allocated = self->allocated;
3131

3232
/* Bypass realloc() when a previous overallocation is large enough
@@ -45,24 +45,19 @@ list_resize(PyListObject *self, Py_ssize_t newsize)
4545
* sequence of appends() in the presence of a poorly-performing
4646
* system realloc().
4747
* The growth pattern is: 0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ...
48+
* Note: new_allocated won't overflow because the largest possible value
49+
* is PY_SSIZE_T_MAX * (9 / 8) + 6 which always fits in a size_t.
4850
*/
49-
new_allocated = (newsize >> 3) + (newsize < 9 ? 3 : 6);
50-
51-
/* check for integer overflow */
52-
if (new_allocated > SIZE_MAX - newsize) {
51+
new_allocated = (size_t)newsize + (newsize >> 3) + (newsize < 9 ? 3 : 6);
52+
if (new_allocated > (size_t)PY_SSIZE_T_MAX / sizeof(PyObject *)) {
5353
PyErr_NoMemory();
5454
return -1;
55-
} else {
56-
new_allocated += newsize;
5755
}
5856

5957
if (newsize == 0)
6058
new_allocated = 0;
61-
items = self->ob_item;
62-
if (new_allocated <= (SIZE_MAX / sizeof(PyObject *)))
63-
PyMem_RESIZE(items, PyObject *, new_allocated);
64-
else
65-
items = NULL;
59+
num_allocated_bytes = new_allocated * sizeof(PyObject *);
60+
items = (PyObject **)PyMem_Realloc(self->ob_item, num_allocated_bytes);
6661
if (items == NULL) {
6762
PyErr_NoMemory();
6863
return -1;

0 commit comments

Comments
 (0)