bpo-40705: Fix use-after-free in _zoneinfo's module_free (GH-20280)

This commit is contained in:
Ammar Askar 2020-05-22 16:10:55 +00:00 committed by GitHub
parent 30d5a7364d
commit 06a1b8915d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 9 additions and 6 deletions

View 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);