summaryrefslogtreecommitdiffstats
path: root/Modules/_zoneinfo.c
diff options
context:
space:
mode:
authorAmmar Askar <ammar@ammaraskar.com>2020-05-22 16:10:55 (GMT)
committerGitHub <noreply@github.com>2020-05-22 16:10:55 (GMT)
commit06a1b8915d6674e40f0dccc422ca2c06212392d8 (patch)
tree4e264812ac42171eaca4bf1f19c78b4fe5c27e7e /Modules/_zoneinfo.c
parent30d5a7364db9e65ccabbdce2c20b84fe2fb233fb (diff)
downloadcpython-06a1b8915d6674e40f0dccc422ca2c06212392d8.zip
cpython-06a1b8915d6674e40f0dccc422ca2c06212392d8.tar.gz
cpython-06a1b8915d6674e40f0dccc422ca2c06212392d8.tar.bz2
bpo-40705: Fix use-after-free in _zoneinfo's module_free (GH-20280)
Diffstat (limited to 'Modules/_zoneinfo.c')
-rw-r--r--Modules/_zoneinfo.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/Modules/_zoneinfo.c b/Modules/_zoneinfo.c
index d7e7157..d852c76 100644
--- a/Modules/_zoneinfo.c
+++ b/Modules/_zoneinfo.c
@@ -2490,6 +2490,7 @@ new_weak_cache()
static int
initialize_caches()
{
+ // TODO: Move to a PyModule_GetState / PEP 573 based caching system.
if (TIMEDELTA_CACHE == NULL) {
TIMEDELTA_CACHE = PyDict_New();
}
@@ -2603,14 +2604,16 @@ module_free()
xdecref_ttinfo(&NO_TTINFO);
- Py_XDECREF(TIMEDELTA_CACHE);
- if (!Py_REFCNT(TIMEDELTA_CACHE)) {
- TIMEDELTA_CACHE = NULL;
+ if (TIMEDELTA_CACHE != NULL && Py_REFCNT(TIMEDELTA_CACHE) > 1) {
+ Py_DECREF(TIMEDELTA_CACHE);
+ } else {
+ Py_CLEAR(TIMEDELTA_CACHE);
}
- Py_XDECREF(ZONEINFO_WEAK_CACHE);
- if (!Py_REFCNT(ZONEINFO_WEAK_CACHE)) {
- ZONEINFO_WEAK_CACHE = NULL;
+ if (ZONEINFO_WEAK_CACHE != NULL && Py_REFCNT(ZONEINFO_WEAK_CACHE) > 1) {
+ Py_DECREF(ZONEINFO_WEAK_CACHE);
+ } else {
+ Py_CLEAR(ZONEINFO_WEAK_CACHE);
}
strong_cache_free(ZONEINFO_STRONG_CACHE);