bpo-40705: Fix use-after-free in _zoneinfo's module_free (GH-20280)
This commit is contained in:
parent
30d5a7364d
commit
06a1b8915d
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue