gh-145301: Fix double-free in hashlib and hmac module initialization (GH-145321)

gh-145301: Fix double-free in hashlib and hmac initialization
This commit is contained in:
krylosov-aa 2026-03-05 06:48:25 +03:00 committed by GitHub
parent 8b54313670
commit 6acaf659ef
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 18 additions and 11 deletions

View file

@ -0,0 +1,2 @@
:mod:`hashlib`: fix a crash when the initialization of the underlying C
extension module fails.

View file

@ -0,0 +1,2 @@
:mod:`hmac`: fix a crash when the initialization of the underlying C
extension module fails.

View file

@ -268,7 +268,7 @@ py_hashentry_table_new(void) {
if (h->py_alias != NULL) {
if (_Py_hashtable_set(ht, (const void*)entry->py_alias, (void*)entry) < 0) {
PyMem_Free(entry);
/* entry is already in ht, will be freed by _Py_hashtable_destroy() */
goto error;
}
entry->refcnt++;

View file

@ -1453,16 +1453,19 @@ py_hmac_hinfo_ht_new(void)
assert(value->display_name == NULL);
value->refcnt = 0;
#define Py_HMAC_HINFO_LINK(KEY) \
do { \
int rc = py_hmac_hinfo_ht_add(table, KEY, value); \
if (rc < 0) { \
PyMem_Free(value); \
goto error; \
} \
else if (rc == 1) { \
value->refcnt++; \
} \
#define Py_HMAC_HINFO_LINK(KEY) \
do { \
int rc = py_hmac_hinfo_ht_add(table, (KEY), value); \
if (rc < 0) { \
/* entry may already be in ht, freed upon exit */ \
if (value->refcnt == 0) { \
PyMem_Free(value); \
} \
goto error; \
} \
else if (rc == 1) { \
value->refcnt++; \
} \
} while (0)
Py_HMAC_HINFO_LINK(e->name);
Py_HMAC_HINFO_LINK(e->hashlib_name);