diff options
author | Paul Ganssle <paul@ganssle.io> | 2020-08-17 22:40:07 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-17 22:40:07 (GMT) |
commit | c3dd7e45cc5d36bbe2295c2840faabb5c75d83e4 (patch) | |
tree | a92a7e7f05f129d762220707719b15665ed5f634 /Modules | |
parent | 8aa163eea6b0fb4693f6c0a314d4f2ccada51d70 (diff) | |
download | cpython-c3dd7e45cc5d36bbe2295c2840faabb5c75d83e4.zip cpython-c3dd7e45cc5d36bbe2295c2840faabb5c75d83e4.tar.gz cpython-c3dd7e45cc5d36bbe2295c2840faabb5c75d83e4.tar.bz2 |
bpo-41568: Fix refleaks in zoneinfo subclasses (GH-21907)
* Fix refleak in C module __init_subclass__
This was leaking a reference to the weak cache dictionary for every
ZoneInfo subclass created.
* Fix refleak in ZoneInfo subclass's clear_cache
The previous version of the code accidentally cleared the global
ZONEINFO_STRONG_CACHE variable (and inducing `ZoneInfo` to create a new
strong cache) on calls to a subclass's `clear_cache()`. This would not
affect guaranteed behavior, but it's still not the right thing to do
(and it caused reference leaks).
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/_zoneinfo.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/Modules/_zoneinfo.c b/Modules/_zoneinfo.c index 12b3969..2cee65f 100644 --- a/Modules/_zoneinfo.c +++ b/Modules/_zoneinfo.c @@ -412,7 +412,6 @@ zoneinfo_clear_cache(PyObject *cls, PyObject *args, PyObject *kwargs) } clear_strong_cache(type); - ZONEINFO_STRONG_CACHE = NULL; } else { PyObject *item = NULL; @@ -2471,6 +2470,7 @@ clear_strong_cache(const PyTypeObject *const type) } strong_cache_free(ZONEINFO_STRONG_CACHE); + ZONEINFO_STRONG_CACHE = NULL; } static PyObject * @@ -2525,6 +2525,7 @@ zoneinfo_init_subclass(PyTypeObject *cls, PyObject *args, PyObject **kwargs) } PyObject_SetAttrString((PyObject *)cls, "_weak_cache", weak_cache); + Py_DECREF(weak_cache); Py_RETURN_NONE; } @@ -2616,8 +2617,7 @@ module_free() Py_CLEAR(ZONEINFO_WEAK_CACHE); } - strong_cache_free(ZONEINFO_STRONG_CACHE); - ZONEINFO_STRONG_CACHE = NULL; + clear_strong_cache(&PyZoneInfo_ZoneInfoType); } static int |