Skip to content

Commit 662f191

Browse files
committed
gh-155833: GC-untrack MD5/SHA* objects before freeing the HACL*state
1 parent c92e2fd commit 662f191

5 files changed

Lines changed: 15 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: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,13 +86,13 @@ newMD5object(MD5State * st)
8686
static void
8787
MD5_dealloc(PyObject *op)
8888
{
89+
PyTypeObject *tp = Py_TYPE(op);
90+
PyObject_GC_UnTrack(op);
8991
MD5object *ptr = _MD5object_CAST(op);
9092
if (ptr->hash_state != NULL) {
9193
Hacl_Hash_MD5_free(ptr->hash_state);
9294
ptr->hash_state = NULL;
9395
}
94-
PyTypeObject *tp = Py_TYPE(op);
95-
PyObject_GC_UnTrack(ptr);
9696
PyObject_GC_Del(ptr);
9797
Py_DECREF(tp);
9898
}

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
@@ -96,6 +96,7 @@ newSHA3object(PyTypeObject *type)
9696
return NULL;
9797
}
9898
HASHLIB_INIT_MUTEX(newobj);
99+
newobj->hash_state = NULL; // PyObject_GC_New() does not zero memory
99100

100101
PyObject_GC_Track(newobj);
101102
return newobj;
@@ -223,7 +224,7 @@ SHA3_dealloc(PyObject *self)
223224
PyTypeObject *tp = Py_TYPE(self);
224225
PyObject_GC_UnTrack(self);
225226
(void)SHA3_clear(self);
226-
tp->tp_free(self);
227+
PyObject_GC_Del(self);
227228
Py_DECREF(tp);
228229
}
229230

0 commit comments

Comments
 (0)