bpo-1621: Avoid signed integer overflow in set_table_resize(). (GH-90… · python/cpython@a9274f7 (original) (raw)

File tree

2 files changed

lines changed

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. */