Skip to content

Commit a9274f7

Browse files
miss-islingtonsir-sigurd
authored andcommitted
bpo-1621: Avoid signed integer overflow in set_table_resize(). (GH-9059) (GH-9199)
Address a C undefined behavior signed integer overflow issue in set object table resizing. Our -fwrapv compiler flag and practical reasons why sets are unlikely to get this large should mean this was never an issue but it was incorrect code that generates code analysis warnings. (cherry picked from commit 6c7d67c) Co-authored-by: Sergey Fedoseev <[email protected]>
1 parent c04347f commit a9274f7

File tree

2 files changed

+5
-8
lines changed

2 files changed

+5
-8
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Do not assume signed integer overflow behavior (C undefined behavior) when
2+
performing set hash table resizing.

Objects/setobject.c

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,6 @@ actually be smaller than the old one.
294294
static int
295295
set_table_resize(PySetObject *so, Py_ssize_t minused)
296296
{
297-
Py_ssize_t newsize;
298297
setentry *oldtable, *newtable, *entry;
299298
Py_ssize_t oldfill = so->fill;
300299
Py_ssize_t oldused = so->used;
@@ -307,13 +306,9 @@ set_table_resize(PySetObject *so, Py_ssize_t minused)
307306

308307
/* Find the smallest table size > minused. */
309308
/* 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.
317312
}
318313

319314
/* Get space for a new table. */

0 commit comments

Comments
 (0)