summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorPaul Ganssle <paul@ganssle.io>2020-08-17 22:40:07 (GMT)
committerGitHub <noreply@github.com>2020-08-17 22:40:07 (GMT)
commitc3dd7e45cc5d36bbe2295c2840faabb5c75d83e4 (patch)
treea92a7e7f05f129d762220707719b15665ed5f634 /Modules
parent8aa163eea6b0fb4693f6c0a314d4f2ccada51d70 (diff)
downloadcpython-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.c6
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