bpo-1621: Avoid signed integer overflow in set_table_resize(). (GH-90… · python/cpython@a9274f7 (original) (raw)
File tree
2 files changed
lines changed
- Misc/NEWS.d/next/Core and Builtins
2 files changed
lines changed
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
1 | +Do not assume signed integer overflow behavior (C undefined behavior) when | |
2 | +performing set hash table resizing. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -294,7 +294,6 @@ actually be smaller than the old one. | ||
294 | 294 | static int |
295 | 295 | set_table_resize(PySetObject *so, Py_ssize_t minused) |
296 | 296 | { |
297 | -Py_ssize_t newsize; | |
298 | 297 | setentry *oldtable, *newtable, *entry; |
299 | 298 | Py_ssize_t oldfill = so->fill; |
300 | 299 | Py_ssize_t oldused = so->used; |
@@ -307,13 +306,9 @@ set_table_resize(PySetObject *so, Py_ssize_t minused) | ||
307 | 306 | |
308 | 307 | /* Find the smallest table size > minused. */ |
309 | 308 | /* XXX speed-up with intrinsics */ |
310 | -for (newsize = PySet_MINSIZE; | |
311 | -newsize <= minused && newsize > 0; | |
312 | -newsize <<= 1) | |
313 | - ; | |
314 | -if (newsize <= 0) { | |
315 | -PyErr_NoMemory(); | |
316 | -return -1; | |
309 | +size_t newsize = PySet_MINSIZE; | |
310 | +while (newsize <= (size_t)minused) { | |
311 | +newsize <<= 1; // The largest possible value is PY_SSIZE_T_MAX + 1. | |
317 | 312 | } |
318 | 313 | |
319 | 314 | /* Get space for a new table. */ |