Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit c6249a6

Browse files
committed
Defer deleted item decref until after the deque is restored to a consistent state.
1 parent 1dd8e71 commit c6249a6

2 files changed

Lines changed: 10 additions & 6 deletions

File tree

Misc/NEWS

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@ Library
4545
- Issues #24099, #24100, and #24101: Fix free-after-use bug in heapq's siftup
4646
and siftdown functions.
4747

48+
- Backport collections.deque fixes from Python 3.5. Prevents reentrant badness
49+
during deletion by deferring the decref until the container has been restored
50+
to a consistent state.
51+
4852
- Issue #23008: Fixed resolving attributes with boolean value is False in pydoc.
4953

5054
- Fix asyncio issue 235: LifoQueue and PriorityQueue's put didn't

Modules/_collectionsmodule.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -698,9 +698,9 @@ deque_remove(dequeobject *deque, PyObject *value)
698698
if (cmp > 0) {
699699
PyObject *tgt = deque_popleft(deque, NULL);
700700
assert (tgt != NULL);
701-
Py_DECREF(tgt);
702-
if (_deque_rotate(deque, i) == -1)
701+
if (_deque_rotate(deque, i))
703702
return NULL;
703+
Py_DECREF(tgt);
704704
Py_RETURN_NONE;
705705
}
706706
else if (cmp < 0) {
@@ -781,16 +781,16 @@ static int
781781
deque_del_item(dequeobject *deque, Py_ssize_t i)
782782
{
783783
PyObject *item;
784+
int rv;
784785

785786
assert (i >= 0 && i < Py_SIZE(deque));
786-
if (_deque_rotate(deque, -i) == -1)
787+
if (_deque_rotate(deque, -i))
787788
return -1;
788-
789789
item = deque_popleft(deque, NULL);
790+
rv = _deque_rotate(deque, i);
790791
assert (item != NULL);
791792
Py_DECREF(item);
792-
793-
return _deque_rotate(deque, i);
793+
return rv;
794794
}
795795

796796
static int

0 commit comments

Comments
 (0)