Skip to content

Commit bfe8dfd

Browse files
committed
gh-152017: Fix deque_clear to no longer alters exceptions
1 parent 7915c4a commit bfe8dfd

2 files changed

Lines changed: 19 additions & 1 deletion

File tree

Lib/test/test_collections.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from test.support.import_helper import import_fresh_module
1616
import types
1717
import unittest
18+
import _testcapi
1819

1920
from collections import namedtuple, Counter, OrderedDict, _count_elements
2021
from collections import UserDict, UserString, UserList
@@ -2475,6 +2476,22 @@ def test_symmetric_difference(self):
24752476
pp ^= qq
24762477
self.assertEqual(pp, r)
24772478

2479+
################################################################################
2480+
### Deque
2481+
################################################################################
2482+
2483+
class TestDeque(unittest.TestCase):
2484+
2485+
def test_deque_oom(self):
2486+
for n in range(1, 80):
2487+
d = deque(range(200))
2488+
_testcapi.set_nomemory(n, 0)
2489+
try:
2490+
d.copy()
2491+
_testcapi.remove_mem_hooks()
2492+
break
2493+
except MemoryError:
2494+
_testcapi.remove_mem_hooks()
24782495

24792496
def load_tests(loader, tests, pattern):
24802497
tests.addTest(doctest.DocTestSuite(collections))

Modules/_collectionsmodule.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -746,9 +746,10 @@ deque_clear(PyObject *self)
746746
adversary could cause it to never terminate).
747747
*/
748748

749+
PyObject *old_exc = PyErr_GetRaisedException();
749750
b = newblock(deque);
751+
PyErr_SetRaisedException(old_exc);
750752
if (b == NULL) {
751-
PyErr_Clear();
752753
goto alternate_method;
753754
}
754755

0 commit comments

Comments
 (0)