Skip to content

Commit

Permalink
bpo-42972: Fully support GC for hashlib heap types (GH-26374)
Browse files Browse the repository at this point in the history
  • Loading branch information
Erlend Egeberg Aasland committed May 27, 2021
1 parent 59af59c commit 6ef5ba3
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 16 deletions.
17 changes: 14 additions & 3 deletions Modules/md5module.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down Expand Up @@ -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
};

Expand Down
17 changes: 14 additions & 3 deletions Modules/sha1module.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down Expand Up @@ -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
};

Expand Down
26 changes: 21 additions & 5 deletions Modules/sha256module.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down Expand Up @@ -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
};

Expand Down
25 changes: 20 additions & 5 deletions Modules/sha512module.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down Expand Up @@ -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
};

Expand All @@ -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}
};

Expand All @@ -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
};

Expand Down

0 comments on commit 6ef5ba3

Please sign in to comment.