From: Brandt Bucher Date: Mon, 12 May 2025 20:00:01 +0000 (-0700) Subject: [3.13] GH-133543: Maintain tracking for materialized instance dictionaries (GH-133617) X-Git-Tag: v3.13.4~118 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=50b45c4f457a7b77ec526fae4d2894c3e4f38e2e;p=thirdparty%2FPython%2Fcpython.git [3.13] GH-133543: Maintain tracking for materialized instance dictionaries (GH-133617) --- diff --git a/Lib/test/test_dict.py b/Lib/test/test_dict.py index 40b0c210ab34..4729132c5a5f 100644 --- a/Lib/test/test_dict.py +++ b/Lib/test/test_dict.py @@ -1006,6 +1006,18 @@ class DictTest(unittest.TestCase): pass self._tracked(MyDict()) + @support.cpython_only + def test_track_lazy_instance_dicts(self): + class C: + pass + o = C() + d = o.__dict__ + self._not_tracked(d) + o.untracked = 42 + self._not_tracked(d) + o.tracked = [] + self._tracked(d) + def make_shared_key_dict(self, n): class C: pass diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-05-07-10-48-31.gh-issue-133543.4jcszP.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-05-07-10-48-31.gh-issue-133543.4jcszP.rst new file mode 100644 index 000000000000..046085892d45 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-05-07-10-48-31.gh-issue-133543.4jcszP.rst @@ -0,0 +1,2 @@ +Fix a possible memory leak that could occur when directly accessing instance +dictionaries (``__dict__``) that later become part of a reference cycle. diff --git a/Objects/dictobject.c b/Objects/dictobject.c index e89ed467bf7c..501f3d2d2bca 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -6839,6 +6839,9 @@ store_instance_attr_lock_held(PyObject *obj, PyDictValues *values, value == NULL ? PyDict_EVENT_DELETED : PyDict_EVENT_MODIFIED); _PyDict_NotifyEvent(interp, event, dict, name, value); + if (value) { + MAINTAIN_TRACKING(dict, name, value); + } } FT_ATOMIC_STORE_PTR_RELEASE(values->values[ix], Py_XNewRef(value));