Skip to content

Commit 7e102ec

Browse files
[3.15] gh-155833: GC-untrack MD5/SHA* objects before freeing the HACL* state (GH-155834) (#159789)
gh-155833: GC-untrack MD5/SHA* objects before freeing the HACL* state (GH-155834) (cherry picked from commit 29fd3b8) Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
1 parent 4ac146b commit 7e102ec

5 files changed

Lines changed: 16 additions & 9 deletions

File tree

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Ensure that MD5 and SHA* objects are properly GC-untracked before freeing
2+
their internal HACL* state. Patch by Bénédikt Tran.

‎Modules/md5module.c‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ newMD5object(MD5State * st)
7777
return NULL;
7878
}
7979
HASHLIB_INIT_MUTEX(md5);
80+
md5->hash_state = NULL; // PyObject_GC_New() does not zero memory
8081

8182
PyObject_GC_Track(md5);
8283
return md5;
@@ -86,13 +87,13 @@ newMD5object(MD5State * st)
8687
static void
8788
MD5_dealloc(PyObject *op)
8889
{
90+
PyTypeObject *tp = Py_TYPE(op);
91+
PyObject_GC_UnTrack(op);
8992
MD5object *ptr = _MD5object_CAST(op);
9093
if (ptr->hash_state != NULL) {
9194
Hacl_Hash_MD5_free(ptr->hash_state);
9295
ptr->hash_state = NULL;
9396
}
94-
PyTypeObject *tp = Py_TYPE(op);
95-
PyObject_GC_UnTrack(ptr);
9697
PyObject_GC_Del(ptr);
9798
Py_DECREF(tp);
9899
}

‎Modules/sha1module.c‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ newSHA1object(SHA1State *st)
7575
return NULL;
7676
}
7777
HASHLIB_INIT_MUTEX(sha);
78+
sha->hash_state = NULL; // PyObject_GC_New() does not zero memory
7879

7980
PyObject_GC_Track(sha);
8081
return sha;
@@ -85,13 +86,13 @@ newSHA1object(SHA1State *st)
8586
static void
8687
SHA1_dealloc(PyObject *op)
8788
{
89+
PyTypeObject *tp = Py_TYPE(op);
90+
PyObject_GC_UnTrack(op);
8891
SHA1object *ptr = _SHA1object_CAST(op);
8992
if (ptr->hash_state != NULL) {
9093
Hacl_Hash_SHA1_free(ptr->hash_state);
9194
ptr->hash_state = NULL;
9295
}
93-
PyTypeObject *tp = Py_TYPE(ptr);
94-
PyObject_GC_UnTrack(ptr);
9596
PyObject_GC_Del(ptr);
9697
Py_DECREF(tp);
9798
}

‎Modules/sha2module.c‎

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ newSHA384object(sha2_state *state)
146146
return NULL;
147147
}
148148
HASHLIB_INIT_MUTEX(sha);
149+
sha->state = NULL; // PyObject_GC_New() does not zero memory
149150

150151
PyObject_GC_Track(sha);
151152
return sha;
@@ -159,6 +160,7 @@ newSHA512object(sha2_state *state)
159160
return NULL;
160161
}
161162
HASHLIB_INIT_MUTEX(sha);
163+
sha->state = NULL; // PyObject_GC_New() does not zero memory
162164

163165
PyObject_GC_Track(sha);
164166
return sha;
@@ -168,27 +170,27 @@ newSHA512object(sha2_state *state)
168170
static void
169171
SHA256_dealloc(PyObject *op)
170172
{
173+
PyTypeObject *tp = Py_TYPE(op);
174+
PyObject_GC_UnTrack(op);
171175
SHA256object *ptr = _SHA256object_CAST(op);
172176
if (ptr->state != NULL) {
173177
Hacl_Hash_SHA2_free_256(ptr->state);
174178
ptr->state = NULL;
175179
}
176-
PyTypeObject *tp = Py_TYPE(ptr);
177-
PyObject_GC_UnTrack(ptr);
178180
PyObject_GC_Del(ptr);
179181
Py_DECREF(tp);
180182
}
181183

182184
static void
183185
SHA512_dealloc(PyObject *op)
184186
{
187+
PyTypeObject *tp = Py_TYPE(op);
188+
PyObject_GC_UnTrack(op);
185189
SHA512object *ptr = _SHA512object_CAST(op);
186190
if (ptr->state != NULL) {
187191
Hacl_Hash_SHA2_free_512(ptr->state);
188192
ptr->state = NULL;
189193
}
190-
PyTypeObject *tp = Py_TYPE(ptr);
191-
PyObject_GC_UnTrack(ptr);
192194
PyObject_GC_Del(ptr);
193195
Py_DECREF(tp);
194196
}

‎Modules/sha3module.c‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ newSHA3object(PyTypeObject *type)
102102
return NULL;
103103
}
104104
HASHLIB_INIT_MUTEX(newobj);
105+
newobj->hash_state = NULL; // PyObject_GC_New() does not zero memory
105106
newobj->digest_size = newobj->block_size = 0;
106107
PyObject_GC_Track(newobj);
107108
return newobj;
@@ -234,7 +235,7 @@ SHA3_dealloc(PyObject *self)
234235
PyTypeObject *tp = Py_TYPE(self);
235236
PyObject_GC_UnTrack(self);
236237
(void)SHA3_clear(self);
237-
tp->tp_free(self);
238+
PyObject_GC_Del(self);
238239
Py_DECREF(tp);
239240
}
240241

0 commit comments

Comments
 (0)