]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-34042: Fix dict.copy() to maintain correct total refcount (GH-8119)
authorYury Selivanov <yury@magic.io>
Fri, 6 Jul 2018 16:20:07 +0000 (12:20 -0400)
committerGitHub <noreply@github.com>
Fri, 6 Jul 2018 16:20:07 +0000 (12:20 -0400)
Misc/NEWS.d/next/Core and Builtins/2018-07-05-15-51-29.bpo-34042.Gr9XUH.rst [new file with mode: 0644]
Objects/dictobject.c

diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-07-05-15-51-29.bpo-34042.Gr9XUH.rst b/Misc/NEWS.d/next/Core and Builtins/2018-07-05-15-51-29.bpo-34042.Gr9XUH.rst
new file mode 100644 (file)
index 0000000..fd1730d
--- /dev/null
@@ -0,0 +1,2 @@
+Fix dict.copy() to maintain correct total refcount (as reported by
+sys.gettotalrefcount()).
index 40d7d8af6ec22407cfe345ede6f535306ed49f2c..413557d6674127ab80c98877ad2854a4f9a47e41 100644 (file)
@@ -656,6 +656,13 @@ clone_combined_dict(PyDictObject *orig)
         /* Maintain tracking. */
         _PyObject_GC_TRACK(new);
     }
+
+    /* Since we copied the keys table we now have an extra reference
+       in the system.  Manually call _Py_INC_REFTOTAL to signal that
+       we have it now; calling DK_INCREF would be an error as
+       keys->dk_refcnt is already set to 1 (after memcpy). */
+    _Py_INC_REFTOTAL;
+
     return (PyObject *)new;
 }