mirror of
https://github.com/python/cpython.git
synced 2025-10-09 08:31:26 +00:00
Issue #17278: Fix a crash in heapq.heappush() and heapq.heappop() when the list is being resized concurrently.
This commit is contained in:
parent
aaef34483c
commit
44d5214927
3 changed files with 63 additions and 6 deletions
|
@ -319,6 +319,16 @@ def L(seqn):
|
|||
return chain(map(lambda x:x, R(Ig(G(seqn)))))
|
||||
|
||||
|
||||
class SideEffectLT:
|
||||
def __init__(self, value, heap):
|
||||
self.value = value
|
||||
self.heap = heap
|
||||
|
||||
def __lt__(self, other):
|
||||
self.heap[:] = []
|
||||
return self.value < other.value
|
||||
|
||||
|
||||
class TestErrorHandling(TestCase):
|
||||
module = None
|
||||
|
||||
|
@ -370,6 +380,22 @@ class TestErrorHandling(TestCase):
|
|||
self.assertRaises(TypeError, f, 2, N(s))
|
||||
self.assertRaises(ZeroDivisionError, f, 2, E(s))
|
||||
|
||||
# Issue #17278: the heap may change size while it's being walked.
|
||||
|
||||
def test_heappush_mutating_heap(self):
|
||||
heap = []
|
||||
heap.extend(SideEffectLT(i, heap) for i in range(200))
|
||||
# Python version raises IndexError, C version RuntimeError
|
||||
with self.assertRaises((IndexError, RuntimeError)):
|
||||
self.module.heappush(heap, SideEffectLT(5, heap))
|
||||
|
||||
def test_heappop_mutating_heap(self):
|
||||
heap = []
|
||||
heap.extend(SideEffectLT(i, heap) for i in range(200))
|
||||
# Python version raises IndexError, C version RuntimeError
|
||||
with self.assertRaises((IndexError, RuntimeError)):
|
||||
self.module.heappop(heap)
|
||||
|
||||
|
||||
class TestErrorHandlingPython(TestErrorHandling):
|
||||
module = py_heapq
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue