From 186562fd4563bf63f8f642dea39be3bb07a8a3bf Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Wed, 26 May 2021 00:01:24 +0200 Subject: [PATCH 1/4] bpo-42972: Fully support GC for sha256 heap types --- Modules/sha256module.c | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/Modules/sha256module.c b/Modules/sha256module.c index 1edb9dc0500298..fac7073d951d2d 100644 --- a/Modules/sha256module.c +++ b/Modules/sha256module.c @@ -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 }; From b2817ab032de53cf6e2ef28c56fa5d84dc7e06a1 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Wed, 26 May 2021 00:05:58 +0200 Subject: [PATCH 2/4] bpo-42972: Fully support GC for sha512 heap types --- Modules/sha512module.c | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/Modules/sha512module.c b/Modules/sha512module.c index 2bae0ce78774c1..4ea2fc16de0526 100644 --- a/Modules/sha512module.c +++ b/Modules/sha512module.c @@ -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 }; From b3816652e58611f857332c97f8b703fb5f120af3 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Wed, 26 May 2021 00:09:48 +0200 Subject: [PATCH 3/4] bpo-42972: Fully support GC for sha1 heap types --- Modules/sha1module.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/Modules/sha1module.c b/Modules/sha1module.c index 1d4bde2d3b67bb..6980051dc08f8a 100644 --- a/Modules/sha1module.c +++ b/Modules/sha1module.c @@ -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 }; From 49226ddc36de6a03172dc8910ecbc4e0faab656c Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Wed, 26 May 2021 00:11:44 +0200 Subject: [PATCH 4/4] bpo-42972: Fully support GC for md5 heap types --- Modules/md5module.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/Modules/md5module.c b/Modules/md5module.c index 9067c27a1181ea..b50d2e5b0bdb71 100644 --- a/Modules/md5module.c +++ b/Modules/md5module.c @@ -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 };