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 @@ -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)
8687static void
8788MD5_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}
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 @@ -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
You can’t perform that action at this time.
0 commit comments