]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.10] bpo-42972: Fully support GC for hashlib heap types (GH-26374) (GH-26398)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Thu, 27 May 2021 08:10:39 +0000 (01:10 -0700)
committerGitHub <noreply@github.com>
Thu, 27 May 2021 08:10:39 +0000 (01:10 -0700)
(cherry picked from commit 6ef5ba391d700bde7ec3ffd5fb7132a30dd309c4)

Co-authored-by: Erlend Egeberg Aasland <erlend.aasland@innova.no>
Automerge-Triggered-By: GH:tiran
Modules/md5module.c
Modules/sha1module.c
Modules/sha256module.c
Modules/sha512module.c

index 9067c27a1181ea33ec022ee5186b0c34734951a4..b50d2e5b0bdb71039e91fc8eb0b22bdd6e3a2eb8 100644 (file)
@@ -333,16 +333,25 @@ md5_get_state(PyObject *module)
 static MD5object *
 newMD5object(MD5State * st)
 {
-    return (MD5object *)PyObject_New(MD5object, st->md5_type);
+    MD5object *md5 = (MD5object *)PyObject_GC_New(MD5object, st->md5_type);
+    PyObject_GC_Track(md5);
+    return md5;
 }
 
 /* Internal methods for a hash object */
+static int
+MD5_traverse(PyObject *ptr, visitproc visit, void *arg)
+{
+    Py_VISIT(Py_TYPE(ptr));
+    return 0;
+}
 
 static void
 MD5_dealloc(PyObject *ptr)
 {
     PyTypeObject *tp = Py_TYPE(ptr);
-    PyObject_Free(ptr);
+    PyObject_GC_UnTrack(ptr);
+    PyObject_GC_Del(ptr);
     Py_DECREF(tp);
 }
 
@@ -478,13 +487,15 @@ static PyType_Slot md5_type_slots[] = {
     {Py_tp_dealloc, MD5_dealloc},
     {Py_tp_methods, MD5_methods},
     {Py_tp_getset, MD5_getseters},
+    {Py_tp_traverse, MD5_traverse},
     {0,0}
 };
 
 static PyType_Spec md5_type_spec = {
     .name = "_md5.md5",
     .basicsize =  sizeof(MD5object),
-    .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE,
+    .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION |
+              Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_HAVE_GC),
     .slots = md5_type_slots
 };
 
index 1d4bde2d3b67bbc03fb733026e2291f6d4ba4e67..6980051dc08f8ad437822ec483bcee7539cdf95b 100644 (file)
@@ -310,17 +310,26 @@ sha1_get_state(PyObject *module)
 static SHA1object *
 newSHA1object(SHA1State *st)
 {
-    return (SHA1object *)PyObject_New(SHA1object, st->sha1_type);
+    SHA1object *sha = (SHA1object *)PyObject_GC_New(SHA1object, st->sha1_type);
+    PyObject_GC_Track(sha);
+    return sha;
 }
 
 
 /* Internal methods for a hash object */
+static int
+SHA1_traverse(PyObject *ptr, visitproc visit, void *arg)
+{
+    Py_VISIT(Py_TYPE(ptr));
+    return 0;
+}
 
 static void
 SHA1_dealloc(PyObject *ptr)
 {
     PyTypeObject *tp = Py_TYPE(ptr);
-    PyObject_Free(ptr);
+    PyObject_GC_UnTrack(ptr);
+    PyObject_GC_Del(ptr);
     Py_DECREF(tp);
 }
 
@@ -456,13 +465,15 @@ static PyType_Slot sha1_type_slots[] = {
     {Py_tp_dealloc, SHA1_dealloc},
     {Py_tp_methods, SHA1_methods},
     {Py_tp_getset, SHA1_getseters},
+    {Py_tp_traverse, SHA1_traverse},
     {0,0}
 };
 
 static PyType_Spec sha1_type_spec = {
     .name = "_sha1.sha1",
     .basicsize =  sizeof(SHA1object),
-    .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE,
+    .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION |
+              Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_HAVE_GC),
     .slots = sha1_type_slots
 };
 
index 1edb9dc0500298c78c771d52ccfc0d79839bc8c7..fac7073d951d2df931e6b214e1f0fe3e78afbb4c 100644 (file)
@@ -382,22 +382,35 @@ sha_final(unsigned char digest[SHA_DIGESTSIZE], SHAobject *sha_info)
 static SHAobject *
 newSHA224object(_sha256_state *state)
 {
-    return (SHAobject *)PyObject_New(SHAobject, state->sha224_type);
+    SHAobject *sha = (SHAobject *)PyObject_GC_New(SHAobject,
+                                                  state->sha224_type);
+    PyObject_GC_Track(sha);
+    return sha;
 }
 
 static SHAobject *
 newSHA256object(_sha256_state *state)
 {
-    return (SHAobject *)PyObject_New(SHAobject, state->sha256_type);
+    SHAobject *sha = (SHAobject *)PyObject_GC_New(SHAobject,
+                                                  state->sha256_type);
+    PyObject_GC_Track(sha);
+    return sha;
 }
 
 /* Internal methods for a hash object */
+static int
+SHA_traverse(PyObject *ptr, visitproc visit, void *arg)
+{
+    Py_VISIT(Py_TYPE(ptr));
+    return 0;
+}
 
 static void
 SHA_dealloc(PyObject *ptr)
 {
     PyTypeObject *tp = Py_TYPE(ptr);
-    PyObject_Free(ptr);
+    PyObject_GC_UnTrack(ptr);
+    PyObject_GC_Del(ptr);
     Py_DECREF(tp);
 }
 
@@ -538,20 +551,23 @@ static PyType_Slot sha256_types_slots[] = {
     {Py_tp_methods, SHA_methods},
     {Py_tp_members, SHA_members},
     {Py_tp_getset, SHA_getseters},
+    {Py_tp_traverse, SHA_traverse},
     {0,0}
 };
 
 static PyType_Spec sha224_type_spec = {
     .name = "_sha256.sha224",
     .basicsize = sizeof(SHAobject),
-    .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE,
+    .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION |
+              Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_HAVE_GC),
     .slots = sha256_types_slots
 };
 
 static PyType_Spec sha256_type_spec = {
     .name = "_sha256.sha256",
     .basicsize = sizeof(SHAobject),
-    .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE,
+    .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION |
+              Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_HAVE_GC),
     .slots = sha256_types_slots
 };
 
index 2bae0ce78774c19dc0cecababd5f9e685172c280..4ea2fc16de05266a516f4414074969ed0d1acb57 100644 (file)
@@ -438,22 +438,33 @@ sha512_get_state(PyObject *module)
 static SHAobject *
 newSHA384object(SHA512State *st)
 {
-    return (SHAobject *)PyObject_New(SHAobject, st->sha384_type);
+    SHAobject *sha = (SHAobject *)PyObject_GC_New(SHAobject, st->sha384_type);
+    PyObject_GC_Track(sha);
+    return sha;
 }
 
 static SHAobject *
 newSHA512object(SHA512State *st)
 {
-    return (SHAobject *)PyObject_New(SHAobject, st->sha512_type);
+    SHAobject *sha = (SHAobject *)PyObject_GC_New(SHAobject, st->sha512_type);
+    PyObject_GC_Track(sha);
+    return sha;
 }
 
 /* Internal methods for a hash object */
+static int
+SHA_traverse(PyObject *ptr, visitproc visit, void *arg)
+{
+    Py_VISIT(Py_TYPE(ptr));
+    return 0;
+}
 
 static void
 SHA512_dealloc(PyObject *ptr)
 {
     PyTypeObject *tp = Py_TYPE(ptr);
-    PyObject_Free(ptr);
+    PyObject_GC_UnTrack(ptr);
+    PyObject_GC_Del(ptr);
     Py_DECREF(tp);
 }
 
@@ -596,13 +607,15 @@ static PyType_Slot sha512_sha384_type_slots[] = {
     {Py_tp_methods, SHA_methods},
     {Py_tp_members, SHA_members},
     {Py_tp_getset, SHA_getseters},
+    {Py_tp_traverse, SHA_traverse},
     {0,0}
 };
 
 static PyType_Spec sha512_sha384_type_spec = {
     .name = "_sha512.sha384",
     .basicsize =  sizeof(SHAobject),
-    .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE,
+    .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION |
+              Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_HAVE_GC),
     .slots = sha512_sha384_type_slots
 };
 
@@ -611,6 +624,7 @@ static PyType_Slot sha512_sha512_type_slots[] = {
     {Py_tp_methods, SHA_methods},
     {Py_tp_members, SHA_members},
     {Py_tp_getset, SHA_getseters},
+    {Py_tp_traverse, SHA_traverse},
     {0,0}
 };
 
@@ -619,7 +633,8 @@ static PyType_Slot sha512_sha512_type_slots[] = {
 static PyType_Spec sha512_sha512_type_spec = {
     .name = "_sha512.sha512",
     .basicsize =  sizeof(SHAobject),
-    .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE,
+    .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION |
+              Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_HAVE_GC),
     .slots = sha512_sha512_type_slots
 };