Skip to content

Commit f1d2d2a

Browse files
committed
address review comments from @vstinner
1 parent 1b647a1 commit f1d2d2a

File tree

2 files changed

+32
-34
lines changed

2 files changed

+32
-34
lines changed

Lib/test/test_itertools.py

Lines changed: 30 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -755,38 +755,36 @@ def keys():
755755
next(g) # must pass with address sanitizer
756756

757757
def test_grouper_reentrant_eq_does_not_crash(self):
758-
# regression test for gh-146613
759-
grouper_iter = None
760-
class Key:
761-
__hash__ = None
762-
763-
def __init__(self, do_advance):
764-
self.do_advance = do_advance
765-
self.payload = bytearray(256)
766-
767-
def __eq__(self, other):
768-
nonlocal grouper_iter
769-
if self.do_advance:
770-
self.do_advance = False
771-
if grouper_iter is not None:
772-
try:
773-
next(grouper_iter)
774-
except StopIteration:
775-
pass
776-
for _ in range(50):
777-
bytearray(256)
778-
return NotImplemented
779-
return True
780-
781-
def keyfunc(element):
782-
if element == 0:
783-
return Key(do_advance=True)
784-
return Key(do_advance=False)
785-
786-
g = itertools.groupby(range(4), keyfunc)
787-
key, grouper_iter = next(g)
788-
items = list(grouper_iter)
789-
self.assertEqual(len(items), 1)
758+
# regression test for gh-146613
759+
grouper_iter = None
760+
761+
class Key:
762+
__hash__ = None
763+
764+
def __init__(self, do_advance):
765+
self.do_advance = do_advance
766+
767+
def __eq__(self, other):
768+
nonlocal grouper_iter
769+
if self.do_advance:
770+
self.do_advance = False
771+
if grouper_iter is not None:
772+
try:
773+
next(grouper_iter)
774+
except StopIteration:
775+
pass
776+
return NotImplemented
777+
return True
778+
779+
def keyfunc(element):
780+
if element == 0:
781+
return Key(do_advance=True)
782+
return Key(do_advance=False)
783+
784+
g = itertools.groupby(range(4), keyfunc)
785+
key, grouper_iter = next(g)
786+
items = list(grouper_iter)
787+
self.assertEqual(len(items), 1)
790788

791789
def test_filter(self):
792790
self.assertEqual(list(filter(isEven, range(6))), [0,2,4])
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
:mod:`itertools`: Fix re-entrant use-after-free in ``_grouper.__next__``
1+
:mod:`itertools`: Fix re-entrant use-after-free in ``itertools.groupby()``
22
that could lead to a segmentation fault when a user-defined ``__eq__``
33
re-enters the grouper iterator. The same pattern was previously fixed
4-
in ``groupby.__next__`` (gh-143543).
4+
in gh-143543.

0 commit comments

Comments
 (0)