]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-40705: Fix use-after-free in _zoneinfo's module_free (GH-20280)
authorAmmar Askar <ammar@ammaraskar.com>
Fri, 22 May 2020 16:10:55 +0000 (16:10 +0000)
committerGitHub <noreply@github.com>
Fri, 22 May 2020 16:10:55 +0000 (12:10 -0400)
Modules/_zoneinfo.c

index d7e71576576437525459303b4c01c53067313d91..d852c763e2e3dbf23f4b8d7a62e39aa1f9d283b7 100644 (file)
@@ -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);