]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-145376: Fix reference leaks in deque (#145421)
authorPieter Eendebak <pieter.eendebak@gmail.com>
Wed, 4 Mar 2026 22:45:43 +0000 (23:45 +0100)
committerGitHub <noreply@github.com>
Wed, 4 Mar 2026 22:45:43 +0000 (23:45 +0100)
Fix a reference leak if newblock() fails in _collections.deque.

Modules/_collectionsmodule.c

index 72865f87fc484f5748764429c6f5700c8889ff57..c3d63c8aab4b477411d00bda7d56992324a6b6d6 100644 (file)
@@ -342,8 +342,10 @@ deque_append_lock_held(dequeobject *deque, PyObject *item, Py_ssize_t maxlen)
 {
     if (deque->rightindex == BLOCKLEN - 1) {
         block *b = newblock(deque);
-        if (b == NULL)
+        if (b == NULL) {
+            Py_DECREF(item);
             return -1;
+        }
         b->leftlink = deque->rightblock;
         CHECK_END(deque->rightblock->rightlink);
         deque->rightblock->rightlink = b;
@@ -389,8 +391,10 @@ deque_appendleft_lock_held(dequeobject *deque, PyObject *item,
 {
     if (deque->leftindex == 0) {
         block *b = newblock(deque);
-        if (b == NULL)
+        if (b == NULL) {
+            Py_DECREF(item);
             return -1;
+        }
         b->rightlink = deque->leftblock;
         CHECK_END(deque->leftblock->leftlink);
         deque->leftblock->leftlink = b;
@@ -564,7 +568,6 @@ deque_extendleft_impl(dequeobject *deque, PyObject *iterable)
     iternext = *Py_TYPE(it)->tp_iternext;
     while ((item = iternext(it)) != NULL) {
         if (deque_appendleft_lock_held(deque, item, maxlen) == -1) {
-            Py_DECREF(item);
             Py_DECREF(it);
             return NULL;
         }