File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1+ Ensure that MD5 and SHA* objects are properly GC-untracked before freeing
2+ their internal HACL* state. Patch by Bénédikt Tran.
Original file line number Diff line number Diff line change @@ -86,13 +86,13 @@ newMD5object(MD5State * st)
8686static void
8787MD5_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}
Original file line number Diff line number Diff 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)
8586static void
8687SHA1_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}
Original file line number Diff line number Diff 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)
168170static void
169171SHA256_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
182184static void
183185SHA512_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}
Original file line number Diff line number Diff 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
You can’t perform that action at this time.
0 commit comments