]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-41568: Fix refleaks in zoneinfo subclasses (GH-21907)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Mon, 17 Aug 2020 23:24:15 +0000 (16:24 -0700)
committerGitHub <noreply@github.com>
Mon, 17 Aug 2020 23:24:15 +0000 (16:24 -0700)
* 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).
(cherry picked from commit c3dd7e45cc5d36bbe2295c2840faabb5c75d83e4)

Co-authored-by: Paul Ganssle <paul@ganssle.io>
Modules/_zoneinfo.c

index 12b3969959bacfb59e9b83e354a80bd9cbf079dc..2cee65fac6dd042aefccde501251b3801f6cc371 100644 (file)
@@ -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