From 4ae1a3f9d4badfb33892e0438c4dd475bcea252d Mon Sep 17 00:00:00 2001 From: Mohamed Koubaa Date: Mon, 10 Aug 2020 11:43:32 -0500 Subject: [PATCH 01/15] port sha1 --- Modules/sha1module.c | 125 ++++++++++++++++++++++--------------------- 1 file changed, 63 insertions(+), 62 deletions(-) diff --git a/Modules/sha1module.c b/Modules/sha1module.c index b0656d83b3ae8b..31141c05628c46 100644 --- a/Modules/sha1module.c +++ b/Modules/sha1module.c @@ -295,13 +295,20 @@ sha1_done(struct sha1_state *sha1, unsigned char *out) * ------------------------------------------------------------------------ */ -static PyTypeObject SHA1type; +typedef struct { + PyTypeObject* sha1_type; +} SHA1State; +static inline SHA1State* sha1_get_state(PyObject *module) { + void *state = PyModule_GetState(module); + assert(state != NULL); + return (SHA1State *)state; +} static SHA1object * -newSHA1object(void) +newSHA1object(SHA1State *st) { - return (SHA1object *)PyObject_New(SHA1object, &SHA1type); + return (SHA1object *)PyObject_New(SHA1object, st->sha1_type); } @@ -326,9 +333,10 @@ static PyObject * SHA1Type_copy_impl(SHA1object *self) /*[clinic end generated code: output=b4e001264620f02a input=b7eae10df6f89b36]*/ { - SHA1object *newobj; + SHA1State *st = PyType_GetModuleState(Py_TYPE(self)); - if ((newobj = newSHA1object()) == NULL) + SHA1object *newobj; + if ((newobj = newSHA1object(st)) == NULL) return NULL; newobj->hash_state = self->hash_state; @@ -422,7 +430,6 @@ sha1_get_digest_size(PyObject *self, void *closure) return PyLong_FromLong(SHA1_DIGESTSIZE); } - static PyGetSetDef SHA1_getseters[] = { {"block_size", (getter)SHA1_get_block_size, NULL, @@ -439,40 +446,19 @@ static PyGetSetDef SHA1_getseters[] = { {NULL} /* Sentinel */ }; -static PyTypeObject SHA1type = { - PyVarObject_HEAD_INIT(NULL, 0) - "_sha1.sha1", /*tp_name*/ - sizeof(SHA1object), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - SHA1_dealloc, /*tp_dealloc*/ - 0, /*tp_vectorcall_offset*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_as_async*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - SHA1_methods, /* tp_methods */ - NULL, /* tp_members */ - SHA1_getseters, /* tp_getset */ +static PyType_Slot sha1_type_slots[] = { + {Py_tp_dealloc, SHA1_dealloc}, + {Py_tp_methods, SHA1_methods}, + {Py_tp_getset, SHA1_getseters}, + {0,0} }; +static PyType_Spec sha1_type_spec = { + .name = "_sha1.sha1", + .basicsize = sizeof(SHA1object), + .flags = Py_TPFLAGS_DEFAULT, + .slots = sha1_type_slots +}; /* The single module-level function: new() */ @@ -496,7 +482,8 @@ _sha1_sha1_impl(PyObject *module, PyObject *string, int usedforsecurity) if (string) GET_BUFFER_VIEW_OR_ERROUT(string, &buf); - if ((new = newSHA1object()) == NULL) { + SHA1State *st = sha1_get_state(module); + if ((new = newSHA1object(st)) == NULL) { if (string) PyBuffer_Release(&buf); return NULL; @@ -526,37 +513,51 @@ static struct PyMethodDef SHA1_functions[] = { {NULL, NULL} /* Sentinel */ }; +static int sha1_exec(PyObject *module) { + SHA1State* st = sha1_get_state(module); + + st->sha1_type = (PyTypeObject *)PyType_FromModuleAndSpec( + module, &sha1_type_spec, NULL); + + if (st->sha1_type == NULL) { + return -1; + } + + //cannot use PyModule_AddType becuase "SHA1Type" + //isn't the same as _PyType_Name(st->sha1_type) + if (PyType_Ready(st->sha1_type) < 0) { + return -1; + } + + Py_INCREF(st->sha1_type); + if (PyModule_AddObject(module, + "SHA1Type", + (PyObject *)st->sha1_type) < 0) { + Py_DECREF(st->sha1_type); + return -1; + } + + return 0; +} + /* Initialize this module. */ +static PyModuleDef_Slot _sha1_slots[] = { + {Py_mod_exec, sha1_exec}, + {0, NULL} +}; + static struct PyModuleDef _sha1module = { PyModuleDef_HEAD_INIT, - "_sha1", - NULL, - -1, - SHA1_functions, - NULL, - NULL, - NULL, - NULL + .m_name = "_sha1", + .m_size = sizeof(SHA1State), + .m_methods = SHA1_functions, + .m_slots = _sha1_slots }; PyMODINIT_FUNC PyInit__sha1(void) { - PyObject *m; - - Py_SET_TYPE(&SHA1type, &PyType_Type); - if (PyType_Ready(&SHA1type) < 0) { - return NULL; - } - - m = PyModule_Create(&_sha1module); - if (m == NULL) { - return NULL; - } - - Py_INCREF((PyObject *)&SHA1type); - PyModule_AddObject(m, "SHA1Type", (PyObject *)&SHA1type); - return m; + return PyModuleDef_Init(&_sha1module); } From b38956614e1f8b338c636e977b91672856848bf8 Mon Sep 17 00:00:00 2001 From: Mohamed Koubaa Date: Mon, 10 Aug 2020 13:26:42 -0500 Subject: [PATCH 02/15] port sha512 --- Modules/sha512module.c | 205 +++++++++++++++++++---------------------- 1 file changed, 96 insertions(+), 109 deletions(-) diff --git a/Modules/sha512module.c b/Modules/sha512module.c index aa2aeedcc6c649..be7a147604e31e 100644 --- a/Modules/sha512module.c +++ b/Modules/sha512module.c @@ -422,20 +422,23 @@ sha512_final(unsigned char digest[SHA_DIGESTSIZE], SHAobject *sha_info) * ------------------------------------------------------------------------ */ -static PyTypeObject SHA384type; -static PyTypeObject SHA512type; - +typedef struct { + PyTypeObject* sha384_type; + PyTypeObject* sha512_type; +} SHA512State; + +static inline SHA512State* sha512_get_state(PyObject *module) { + void *state = PyModule_GetState(module); + assert(state != NULL); + return (SHA512State *)state; +} -static SHAobject * -newSHA384object(void) -{ - return (SHAobject *)PyObject_New(SHAobject, &SHA384type); +static SHAobject *newSHA384object(SHA512State *st) { + return (SHAobject *)PyObject_New(SHAobject, st->sha384_type); } -static SHAobject * -newSHA512object(void) -{ - return (SHAobject *)PyObject_New(SHAobject, &SHA512type); +static SHAobject *newSHA512object(SHA512State *st) { + return (SHAobject *)PyObject_New(SHAobject, st->sha512_type); } /* Internal methods for a hash object */ @@ -460,12 +463,13 @@ SHA512Type_copy_impl(SHAobject *self) /*[clinic end generated code: output=adea896ed3164821 input=9f5f31e6c457776a]*/ { SHAobject *newobj; + SHA512State *st = PyType_GetModuleState(Py_TYPE(self)); - if (Py_IS_TYPE((PyObject*)self, &SHA512type)) { - if ( (newobj = newSHA512object())==NULL) + if (Py_IS_TYPE((PyObject*)self, st->sha512_type)) { + if ( (newobj = newSHA512object(st))==NULL) return NULL; } else { - if ( (newobj = newSHA384object())==NULL) + if ( (newobj = newSHA384object(st))==NULL) return NULL; } @@ -574,74 +578,35 @@ static PyMemberDef SHA_members[] = { {NULL} /* Sentinel */ }; -static PyTypeObject SHA384type = { - PyVarObject_HEAD_INIT(NULL, 0) - "_sha512.sha384", /*tp_name*/ - sizeof(SHAobject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - SHA512_dealloc, /*tp_dealloc*/ - 0, /*tp_vectorcall_offset*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_as_async*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - SHA_methods, /* tp_methods */ - SHA_members, /* tp_members */ - SHA_getseters, /* tp_getset */ +static PyType_Slot sha512_sha384_type_slots[] = { + {Py_tp_dealloc, SHA512_dealloc}, + {Py_tp_methods, SHA_methods}, + {Py_tp_members, SHA_members}, + {Py_tp_getset, SHA_getseters}, + {0,0} }; -static PyTypeObject SHA512type = { - PyVarObject_HEAD_INIT(NULL, 0) - "_sha512.sha512", /*tp_name*/ - sizeof(SHAobject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - SHA512_dealloc, /*tp_dealloc*/ - 0, /*tp_vectorcall_offset*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_as_async*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - SHA_methods, /* tp_methods */ - SHA_members, /* tp_members */ - SHA_getseters, /* tp_getset */ +static PyType_Spec sha512_sha384_type_spec = { + .name = "_sha512.sha384", + .basicsize = sizeof(SHAobject), + .flags = Py_TPFLAGS_DEFAULT, + .slots = sha512_sha384_type_slots }; +static PyType_Slot sha512_sha512_type_slots[] = { + {Py_tp_dealloc, SHA512_dealloc}, + {Py_tp_methods, SHA_methods}, + {Py_tp_members, SHA_members}, + {Py_tp_getset, SHA_getseters}, + {0,0} +}; + +static PyType_Spec sha512_sha512_type_spec = { + .name = "_sha512.sha512", + .basicsize = sizeof(SHAobject), + .flags = Py_TPFLAGS_DEFAULT, + .slots = sha512_sha512_type_slots +}; /* The single module-level function: new() */ @@ -662,10 +627,12 @@ _sha512_sha512_impl(PyObject *module, PyObject *string, int usedforsecurity) SHAobject *new; Py_buffer buf; + SHA512State *st = sha512_get_state(module); + if (string) GET_BUFFER_VIEW_OR_ERROUT(string, &buf); - if ((new = newSHA512object()) == NULL) { + if ((new = newSHA512object(st)) == NULL) { if (string) PyBuffer_Release(&buf); return NULL; @@ -704,10 +671,12 @@ _sha512_sha384_impl(PyObject *module, PyObject *string, int usedforsecurity) SHAobject *new; Py_buffer buf; + SHA512State *st = sha512_get_state(module); + if (string) GET_BUFFER_VIEW_OR_ERROUT(string, &buf); - if ((new = newSHA384object()) == NULL) { + if ((new = newSHA384object(st)) == NULL) { if (string) PyBuffer_Release(&buf); return NULL; @@ -740,41 +709,59 @@ static struct PyMethodDef SHA_functions[] = { /* Initialize this module. */ +static int sha512_exec(PyObject *m) { + SHA512State* st = sha512_get_state(m); -static struct PyModuleDef _sha512module = { - PyModuleDef_HEAD_INIT, - "_sha512", - NULL, - -1, - SHA_functions, - NULL, - NULL, - NULL, - NULL -}; + st->sha384_type = (PyTypeObject *)PyType_FromModuleAndSpec( + m, &sha512_sha384_type_spec, NULL); -PyMODINIT_FUNC -PyInit__sha512(void) -{ - PyObject *m; + st->sha512_type = (PyTypeObject *)PyType_FromModuleAndSpec( + m, &sha512_sha512_type_spec, NULL); - Py_SET_TYPE(&SHA384type, &PyType_Type); - if (PyType_Ready(&SHA384type) < 0) { - return NULL; + if (st->sha384_type == NULL || st->sha512_type == NULL) { + return -1; } - Py_SET_TYPE(&SHA512type, &PyType_Type); - if (PyType_Ready(&SHA512type) < 0) { - return NULL; + + //cannot use PyModule_AddType becuase "SHA1Type" + //isn't the same as _PyType_Name(st->sha1_type) + if (PyType_Ready(st->sha384_type) < 0) { + return -1; } - m = PyModule_Create(&_sha512module); - if (m == NULL) { - return NULL; + if (PyType_Ready(st->sha512_type) < 0) { + return -1; } - Py_INCREF((PyObject *)&SHA384type); - PyModule_AddObject(m, "SHA384Type", (PyObject *)&SHA384type); - Py_INCREF((PyObject *)&SHA512type); - PyModule_AddObject(m, "SHA512Type", (PyObject *)&SHA512type); - return m; + Py_INCREF(st->sha384_type); + if (PyModule_AddObject(m, "SHA384Type", (PyObject *)st->sha384_type) < 0) { + Py_DECREF(st->sha384_type); + return -1; + } + + Py_INCREF(st->sha512_type); + if (PyModule_AddObject(m, "SHA384Type", (PyObject *)st->sha512_type) < 0) { + Py_DECREF(st->sha512_type); + return -1; + } + + return 0; +} + +static PyModuleDef_Slot _sha512_slots[] = { + {Py_mod_exec, sha512_exec}, + {0, NULL} +}; + +static struct PyModuleDef _sha512module = { + PyModuleDef_HEAD_INIT, + .m_name = "_sha512", + .m_size = sizeof(SHA512State), + .m_methods = SHA_functions, + .m_slots = _sha512_slots +}; + +PyMODINIT_FUNC +PyInit__sha512(void) +{ + return PyModuleDef_Init(&_sha512module); } From 8add6b16a95c1a6afe4ad5239705eb8f1ad08ee4 Mon Sep 17 00:00:00 2001 From: Mohamed Koubaa Date: Mon, 10 Aug 2020 13:51:16 -0500 Subject: [PATCH 03/15] port md5 --- Modules/md5module.c | 124 ++++++++++++++++++++++---------------------- 1 file changed, 61 insertions(+), 63 deletions(-) diff --git a/Modules/md5module.c b/Modules/md5module.c index e4d9db40f22df3..e1da14b84217e6 100644 --- a/Modules/md5module.c +++ b/Modules/md5module.c @@ -318,16 +318,22 @@ md5_done(struct md5_state *md5, unsigned char *out) * ------------------------------------------------------------------------ */ -static PyTypeObject MD5type; +typedef struct { + PyTypeObject* md5_type; +} MD5State; +static inline MD5State* md5_get_state(PyObject *module) { + void *state = PyModule_GetState(module); + assert(state != NULL); + return (MD5State *)state; +} static MD5object * -newMD5object(void) +newMD5object(MD5State * st) { - return (MD5object *)PyObject_New(MD5object, &MD5type); + return (MD5object *)PyObject_New(MD5object, st->md5_type); } - /* Internal methods for a hash object */ static void @@ -349,9 +355,10 @@ static PyObject * MD5Type_copy_impl(MD5object *self) /*[clinic end generated code: output=596eb36852f02071 input=2c09e6d2493f3079]*/ { - MD5object *newobj; + MD5State *st = PyType_GetModuleState(Py_TYPE(self)); - if ((newobj = newMD5object())==NULL) + MD5object *newobj; + if ((newobj = newMD5object(st))==NULL) return NULL; newobj->hash_state = self->hash_state; @@ -445,7 +452,6 @@ md5_get_digest_size(PyObject *self, void *closure) return PyLong_FromLong(MD5_DIGESTSIZE); } - static PyGetSetDef MD5_getseters[] = { {"block_size", (getter)MD5_get_block_size, NULL, @@ -462,40 +468,19 @@ static PyGetSetDef MD5_getseters[] = { {NULL} /* Sentinel */ }; -static PyTypeObject MD5type = { - PyVarObject_HEAD_INIT(NULL, 0) - "_md5.md5", /*tp_name*/ - sizeof(MD5object), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - MD5_dealloc, /*tp_dealloc*/ - 0, /*tp_vectorcall_offset*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_as_async*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - MD5_methods, /* tp_methods */ - NULL, /* tp_members */ - MD5_getseters, /* tp_getset */ +static PyType_Slot md5_type_slots[] = { + {Py_tp_dealloc, MD5_dealloc}, + {Py_tp_methods, MD5_methods}, + {Py_tp_getset, MD5_getseters}, + {0,0} }; +static PyType_Spec md5_type_spec = { + .name = "_md5.md5", + .basicsize = sizeof(MD5object), + .flags = Py_TPFLAGS_DEFAULT, + .slots = md5_type_slots +}; /* The single module-level function: new() */ @@ -519,7 +504,8 @@ _md5_md5_impl(PyObject *module, PyObject *string, int usedforsecurity) if (string) GET_BUFFER_VIEW_OR_ERROUT(string, &buf); - if ((new = newMD5object()) == NULL) { + MD5State *st = md5_get_state(module); + if ((new = newMD5object(st)) == NULL) { if (string) PyBuffer_Release(&buf); return NULL; @@ -551,35 +537,47 @@ static struct PyMethodDef MD5_functions[] = { /* Initialize this module. */ +static int md5_exec(PyObject *m) { + MD5State *st = md5_get_state(m); + + st->md5_type = (PyTypeObject *)PyType_FromModuleAndSpec( + m, &md5_type_spec, NULL); + + if (st->md5_type == NULL) { + return -1; + } + + //cannot use PyModule_AddType becuase "MD5Type" + //isn't the same as _PyType_Name(st->md5_type) + if (PyType_Ready(st->md5_type) < 0) { + return -1; + } + + Py_INCREF((PyObject *)st->md5_type); + if (PyModule_AddObject(m, "MD5Type", (PyObject *)st->md5_type) < 0) { + Py_DECREF(st->md5_type); + return -1; + } + + return 0; +} + +static PyModuleDef_Slot _md5_slots[] = { + {Py_mod_exec, md5_exec}, + {0, NULL} +}; + static struct PyModuleDef _md5module = { PyModuleDef_HEAD_INIT, - "_md5", - NULL, - -1, - MD5_functions, - NULL, - NULL, - NULL, - NULL + .m_name = "_md5", + .m_size = sizeof(MD5State), + .m_methods = MD5_functions, + .m_slots = _md5_slots }; PyMODINIT_FUNC PyInit__md5(void) { - PyObject *m; - - Py_SET_TYPE(&MD5type, &PyType_Type); - if (PyType_Ready(&MD5type) < 0) { - return NULL; - } - - m = PyModule_Create(&_md5module); - if (m == NULL) { - return NULL; - } - - Py_INCREF((PyObject *)&MD5type); - PyModule_AddObject(m, "MD5Type", (PyObject *)&MD5type); - return m; + return PyModuleDef_Init(&_md5module); } From 3ff18f764e1158ef966f9bf78929833c95453716 Mon Sep 17 00:00:00 2001 From: Mohamed Koubaa Date: Mon, 10 Aug 2020 16:11:42 -0500 Subject: [PATCH 04/15] blurb --- .../2020-08-10-16-11-32.bpo-1635741.O0d3ym.rst | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-08-10-16-11-32.bpo-1635741.O0d3ym.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-08-10-16-11-32.bpo-1635741.O0d3ym.rst b/Misc/NEWS.d/next/Core and Builtins/2020-08-10-16-11-32.bpo-1635741.O0d3ym.rst new file mode 100644 index 00000000000000..c6e20a1985d4ef --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-08-10-16-11-32.bpo-1635741.O0d3ym.rst @@ -0,0 +1,3 @@ +Port :mod:`sha1` to multi-phase init +Port :mod:`sha512` to multi-phase init +Port :mod:`md5` to multi-phase init From 9388486e94347534fb94db9a7ec788aa455c7b1b Mon Sep 17 00:00:00 2001 From: Mohamed Koubaa Date: Fri, 21 Aug 2020 18:43:07 -0500 Subject: [PATCH 05/15] address comments --- Modules/clinic/sha512module.c.h | 21 ++++++++++++++++----- Modules/md5module.c | 3 +++ Modules/sha1module.c | 3 +++ Modules/sha512module.c | 13 ++++++++++--- 4 files changed, 32 insertions(+), 8 deletions(-) diff --git a/Modules/clinic/sha512module.c.h b/Modules/clinic/sha512module.c.h index b8185b62bb6696..f1192d74f9a1ab 100644 --- a/Modules/clinic/sha512module.c.h +++ b/Modules/clinic/sha512module.c.h @@ -9,15 +9,26 @@ PyDoc_STRVAR(SHA512Type_copy__doc__, "Return a copy of the hash object."); #define SHA512TYPE_COPY_METHODDEF \ - {"copy", (PyCFunction)SHA512Type_copy, METH_NOARGS, SHA512Type_copy__doc__}, + {"copy", (PyCFunction)(void(*)(void))SHA512Type_copy, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, SHA512Type_copy__doc__}, static PyObject * -SHA512Type_copy_impl(SHAobject *self); +SHA512Type_copy_impl(SHAobject *self, PyTypeObject *cls); static PyObject * -SHA512Type_copy(SHAobject *self, PyObject *Py_UNUSED(ignored)) +SHA512Type_copy(SHAobject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - return SHA512Type_copy_impl(self); + PyObject *return_value = NULL; + static const char * const _keywords[] = { NULL}; + static _PyArg_Parser _parser = {":copy", _keywords, 0}; + + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser + )) { + goto exit; + } + return_value = SHA512Type_copy_impl(self, cls); + +exit: + return return_value; } PyDoc_STRVAR(SHA512Type_digest__doc__, @@ -166,4 +177,4 @@ _sha512_sha384(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje exit: return return_value; } -/*[clinic end generated code: output=bbfa72d8703c82b5 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=9ff9f11937fabf35 input=a9049054013a1b77]*/ diff --git a/Modules/md5module.c b/Modules/md5module.c index e1da14b84217e6..4ef573fd82fde8 100644 --- a/Modules/md5module.c +++ b/Modules/md5module.c @@ -340,6 +340,7 @@ static void MD5_dealloc(PyObject *ptr) { PyObject_Del(ptr); + Py_DECREF(Py_TYPE(ptr)); } @@ -475,6 +476,8 @@ static PyType_Slot md5_type_slots[] = { {0,0} }; +// Using PyType_GetModuleState() on this type is safe since +// it cannot be subclassed: it does not have the Py_TPFLAGS_BASETYPE flag. static PyType_Spec md5_type_spec = { .name = "_md5.md5", .basicsize = sizeof(MD5object), diff --git a/Modules/sha1module.c b/Modules/sha1module.c index 31141c05628c46..919168556b9c0b 100644 --- a/Modules/sha1module.c +++ b/Modules/sha1module.c @@ -318,6 +318,7 @@ static void SHA1_dealloc(PyObject *ptr) { PyObject_Del(ptr); + Py_DECREF(Py_TYPE(ptr)); } @@ -453,6 +454,8 @@ static PyType_Slot sha1_type_slots[] = { {0,0} }; +// Using PyType_GetModuleState() on this type is safe since +// it cannot be subclassed: it does not have the Py_TPFLAGS_BASETYPE flag. static PyType_Spec sha1_type_spec = { .name = "_sha1.sha1", .basicsize = sizeof(SHA1object), diff --git a/Modules/sha512module.c b/Modules/sha512module.c index be7a147604e31e..3739ec7fe79ad9 100644 --- a/Modules/sha512module.c +++ b/Modules/sha512module.c @@ -447,6 +447,7 @@ static void SHA512_dealloc(PyObject *ptr) { PyObject_Del(ptr); + Py_DECREF(Py_TYPE(ptr)); } @@ -455,15 +456,17 @@ SHA512_dealloc(PyObject *ptr) /*[clinic input] SHA512Type.copy + cls: defining_class + Return a copy of the hash object. [clinic start generated code]*/ static PyObject * -SHA512Type_copy_impl(SHAobject *self) -/*[clinic end generated code: output=adea896ed3164821 input=9f5f31e6c457776a]*/ +SHA512Type_copy_impl(SHAobject *self, PyTypeObject *cls) +/*[clinic end generated code: output=85ea5b47837a08e6 input=f673a18f66527c90]*/ { SHAobject *newobj; - SHA512State *st = PyType_GetModuleState(Py_TYPE(self)); + SHA512State *st = PyType_GetModuleState(cls); if (Py_IS_TYPE((PyObject*)self, st->sha512_type)) { if ( (newobj = newSHA512object(st))==NULL) @@ -586,6 +589,8 @@ static PyType_Slot sha512_sha384_type_slots[] = { {0,0} }; +// Using PyType_GetModuleState() on this type is safe since +// it cannot be subclassed: it does not have the Py_TPFLAGS_BASETYPE flag. static PyType_Spec sha512_sha384_type_spec = { .name = "_sha512.sha384", .basicsize = sizeof(SHAobject), @@ -601,6 +606,8 @@ static PyType_Slot sha512_sha512_type_slots[] = { {0,0} }; +// Using PyType_GetModuleState() on this type is safe since +// it cannot be subclassed: it does not have the Py_TPFLAGS_BASETYPE flag. static PyType_Spec sha512_sha512_type_spec = { .name = "_sha512.sha512", .basicsize = sizeof(SHAobject), From e0c0febfae00b52c76ae977ad71cf7e7f1f780bf Mon Sep 17 00:00:00 2001 From: Mohamed Koubaa Date: Fri, 21 Aug 2020 18:44:44 -0500 Subject: [PATCH 06/15] remove unneeded comment --- Modules/md5module.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/Modules/md5module.c b/Modules/md5module.c index 4ef573fd82fde8..270c1aa94e15bd 100644 --- a/Modules/md5module.c +++ b/Modules/md5module.c @@ -550,8 +550,6 @@ static int md5_exec(PyObject *m) { return -1; } - //cannot use PyModule_AddType becuase "MD5Type" - //isn't the same as _PyType_Name(st->md5_type) if (PyType_Ready(st->md5_type) < 0) { return -1; } From 6c7f4352ee3a73cfc212f4ba99615357cca9be1c Mon Sep 17 00:00:00 2001 From: Mohamed Koubaa Date: Thu, 27 Aug 2020 19:14:39 -0500 Subject: [PATCH 07/15] fix use-after-free --- Modules/md5module.c | 2 +- Modules/sha1module.c | 2 +- Modules/sha512module.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/md5module.c b/Modules/md5module.c index 270c1aa94e15bd..0d7b98b22f3b3d 100644 --- a/Modules/md5module.c +++ b/Modules/md5module.c @@ -339,8 +339,8 @@ newMD5object(MD5State * st) static void MD5_dealloc(PyObject *ptr) { - PyObject_Del(ptr); Py_DECREF(Py_TYPE(ptr)); + PyObject_Del(ptr); } diff --git a/Modules/sha1module.c b/Modules/sha1module.c index 919168556b9c0b..648986ddc11225 100644 --- a/Modules/sha1module.c +++ b/Modules/sha1module.c @@ -317,8 +317,8 @@ newSHA1object(SHA1State *st) static void SHA1_dealloc(PyObject *ptr) { - PyObject_Del(ptr); Py_DECREF(Py_TYPE(ptr)); + PyObject_Del(ptr); } diff --git a/Modules/sha512module.c b/Modules/sha512module.c index 3739ec7fe79ad9..8313ba87d5e836 100644 --- a/Modules/sha512module.c +++ b/Modules/sha512module.c @@ -446,8 +446,8 @@ static SHAobject *newSHA512object(SHA512State *st) { static void SHA512_dealloc(PyObject *ptr) { - PyObject_Del(ptr); Py_DECREF(Py_TYPE(ptr)); + PyObject_Del(ptr); } From 37e228278f9486d9a8e80444046e1418557164e3 Mon Sep 17 00:00:00 2001 From: Mohamed Koubaa Date: Thu, 27 Aug 2020 19:31:45 -0500 Subject: [PATCH 08/15] add traverse/clear/free module methods --- Modules/md5module.c | 29 +++++++++++++++++++++++++++-- Modules/sha1module.c | 27 ++++++++++++++++++++++++++- Modules/sha512module.c | 32 ++++++++++++++++++++++++++++++-- 3 files changed, 83 insertions(+), 5 deletions(-) diff --git a/Modules/md5module.c b/Modules/md5module.c index 0d7b98b22f3b3d..a25b62b12bb6ab 100644 --- a/Modules/md5module.c +++ b/Modules/md5module.c @@ -538,9 +538,31 @@ static struct PyMethodDef MD5_functions[] = { {NULL, NULL} /* Sentinel */ }; +static int +_md5_traverse(PyObject *module, visitproc visit, void *arg) +{ + MD5State *state = md5_get_state(module); + Py_VISIT(state->md5_type); + return 0; +} + +static int +_md5_clear(PyObject *module) +{ + MD5State *state = md5_get_state(module); + Py_CLEAR(state->md5_type); + return 0; +} + +static void +_md5_free(void *module) +{ + _md5_clear((PyObject *)module); +} /* Initialize this module. */ -static int md5_exec(PyObject *m) { +static int md5_exec(PyObject *m) +{ MD5State *st = md5_get_state(m); st->md5_type = (PyTypeObject *)PyType_FromModuleAndSpec( @@ -574,7 +596,10 @@ static struct PyModuleDef _md5module = { .m_name = "_md5", .m_size = sizeof(MD5State), .m_methods = MD5_functions, - .m_slots = _md5_slots + .m_slots = _md5_slots, + .m_traverse = _md5_traverse, + .m_clear = _md5_clear, + .m_free = _md5_free, }; PyMODINIT_FUNC diff --git a/Modules/sha1module.c b/Modules/sha1module.c index 648986ddc11225..a51bc8d71c047c 100644 --- a/Modules/sha1module.c +++ b/Modules/sha1module.c @@ -516,6 +516,28 @@ static struct PyMethodDef SHA1_functions[] = { {NULL, NULL} /* Sentinel */ }; +static int +_sha1_traverse(PyObject *module, visitproc visit, void *arg) +{ + SHA1State *state = sha1_get_state(module); + Py_VISIT(state->sha1_type); + return 0; +} + +static int +_sha1_clear(PyObject *module) +{ + SHA1State *state = sha1_get_state(module); + Py_CLEAR(state->sha1_type); + return 0; +} + +static void +_sha1_free(void *module) +{ + _sha1_clear((PyObject *)module); +} + static int sha1_exec(PyObject *module) { SHA1State* st = sha1_get_state(module); @@ -556,7 +578,10 @@ static struct PyModuleDef _sha1module = { .m_name = "_sha1", .m_size = sizeof(SHA1State), .m_methods = SHA1_functions, - .m_slots = _sha1_slots + .m_slots = _sha1_slots, + .m_traverse = _sha1_traverse, + .m_clear = _sha1_clear, + .m_free = _sha1_free }; PyMODINIT_FUNC diff --git a/Modules/sha512module.c b/Modules/sha512module.c index 8313ba87d5e836..76c8dc4481a74d 100644 --- a/Modules/sha512module.c +++ b/Modules/sha512module.c @@ -714,9 +714,34 @@ static struct PyMethodDef SHA_functions[] = { {NULL, NULL} /* Sentinel */ }; +static int +_sha512_traverse(PyObject *module, visitproc visit, void *arg) +{ + SHA512State *state = sha512_get_state(module); + Py_VISIT(state->sha384_type); + Py_VISIT(state->sha512_type); + return 0; +} + +static int +_sha512_clear(PyObject *module) +{ + SHA512State *state = sha512_get_state(module); + Py_CLEAR(state->sha384_type); + Py_CLEAR(state->sha512_type); + return 0; +} + +static void +_sha512_free(void *module) +{ + _sha512_clear((PyObject *)module); +} + /* Initialize this module. */ -static int sha512_exec(PyObject *m) { +static int sha512_exec(PyObject *m) +{ SHA512State* st = sha512_get_state(m); st->sha384_type = (PyTypeObject *)PyType_FromModuleAndSpec( @@ -764,7 +789,10 @@ static struct PyModuleDef _sha512module = { .m_name = "_sha512", .m_size = sizeof(SHA512State), .m_methods = SHA_functions, - .m_slots = _sha512_slots + .m_slots = _sha512_slots, + .m_traverse = _sha512_traverse, + .m_clear = _sha512_clear, + .m_free = _sha512_free }; PyMODINIT_FUNC From 0384e6b967f32879cc38d0b377ff758e6165dfd6 Mon Sep 17 00:00:00 2001 From: Mohamed Koubaa Date: Fri, 28 Aug 2020 21:03:53 -0500 Subject: [PATCH 09/15] resolve comments --- .../2020-08-10-16-11-32.bpo-1635741.O0d3ym.rst | 4 +--- Modules/md5module.c | 10 ++++------ Modules/sha1module.c | 15 ++++++--------- Modules/sha512module.c | 16 ++++------------ 4 files changed, 15 insertions(+), 30 deletions(-) diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-08-10-16-11-32.bpo-1635741.O0d3ym.rst b/Misc/NEWS.d/next/Core and Builtins/2020-08-10-16-11-32.bpo-1635741.O0d3ym.rst index c6e20a1985d4ef..be6c05a59b7e9b 100644 --- a/Misc/NEWS.d/next/Core and Builtins/2020-08-10-16-11-32.bpo-1635741.O0d3ym.rst +++ b/Misc/NEWS.d/next/Core and Builtins/2020-08-10-16-11-32.bpo-1635741.O0d3ym.rst @@ -1,3 +1 @@ -Port :mod:`sha1` to multi-phase init -Port :mod:`sha512` to multi-phase init -Port :mod:`md5` to multi-phase init +Port :mod:`sha1`, :mod:`sha512`, and :mod:`md5` to multi-phase init (PEP 489) diff --git a/Modules/md5module.c b/Modules/md5module.c index a25b62b12bb6ab..8da2ec6f265fa0 100644 --- a/Modules/md5module.c +++ b/Modules/md5module.c @@ -322,7 +322,8 @@ typedef struct { PyTypeObject* md5_type; } MD5State; -static inline MD5State* md5_get_state(PyObject *module) { +static inline MD5State* md5_get_state(PyObject *module) +{ void *state = PyModule_GetState(module); assert(state != NULL); return (MD5State *)state; @@ -339,8 +340,9 @@ newMD5object(MD5State * st) static void MD5_dealloc(PyObject *ptr) { - Py_DECREF(Py_TYPE(ptr)); + PyObject *tp = Py_TYPE(ptr); PyObject_Del(ptr); + Py_DECREF(tp); } @@ -572,10 +574,6 @@ static int md5_exec(PyObject *m) return -1; } - if (PyType_Ready(st->md5_type) < 0) { - return -1; - } - Py_INCREF((PyObject *)st->md5_type); if (PyModule_AddObject(m, "MD5Type", (PyObject *)st->md5_type) < 0) { Py_DECREF(st->md5_type); diff --git a/Modules/sha1module.c b/Modules/sha1module.c index a51bc8d71c047c..6af2bcbe938b0d 100644 --- a/Modules/sha1module.c +++ b/Modules/sha1module.c @@ -299,7 +299,8 @@ typedef struct { PyTypeObject* sha1_type; } SHA1State; -static inline SHA1State* sha1_get_state(PyObject *module) { +static inline SHA1State* sha1_get_state(PyObject *module) +{ void *state = PyModule_GetState(module); assert(state != NULL); return (SHA1State *)state; @@ -317,8 +318,9 @@ newSHA1object(SHA1State *st) static void SHA1_dealloc(PyObject *ptr) { - Py_DECREF(Py_TYPE(ptr)); + PyObject *tp = Py_TYPE(ptr); PyObject_Del(ptr); + Py_DECREF(tp); } @@ -538,7 +540,8 @@ _sha1_free(void *module) _sha1_clear((PyObject *)module); } -static int sha1_exec(PyObject *module) { +static int sha1_exec(PyObject *module) +{ SHA1State* st = sha1_get_state(module); st->sha1_type = (PyTypeObject *)PyType_FromModuleAndSpec( @@ -548,12 +551,6 @@ static int sha1_exec(PyObject *module) { return -1; } - //cannot use PyModule_AddType becuase "SHA1Type" - //isn't the same as _PyType_Name(st->sha1_type) - if (PyType_Ready(st->sha1_type) < 0) { - return -1; - } - Py_INCREF(st->sha1_type); if (PyModule_AddObject(module, "SHA1Type", diff --git a/Modules/sha512module.c b/Modules/sha512module.c index 76c8dc4481a74d..165e9f200257fd 100644 --- a/Modules/sha512module.c +++ b/Modules/sha512module.c @@ -427,7 +427,8 @@ typedef struct { PyTypeObject* sha512_type; } SHA512State; -static inline SHA512State* sha512_get_state(PyObject *module) { +static inline SHA512State* sha512_get_state(PyObject *module) +{ void *state = PyModule_GetState(module); assert(state != NULL); return (SHA512State *)state; @@ -446,8 +447,9 @@ static SHAobject *newSHA512object(SHA512State *st) { static void SHA512_dealloc(PyObject *ptr) { - Py_DECREF(Py_TYPE(ptr)); + PyObject *tp = Py_TYPE(ptr); PyObject_Del(ptr); + Py_DECREF(tp); } @@ -754,16 +756,6 @@ static int sha512_exec(PyObject *m) return -1; } - //cannot use PyModule_AddType becuase "SHA1Type" - //isn't the same as _PyType_Name(st->sha1_type) - if (PyType_Ready(st->sha384_type) < 0) { - return -1; - } - - if (PyType_Ready(st->sha512_type) < 0) { - return -1; - } - Py_INCREF(st->sha384_type); if (PyModule_AddObject(m, "SHA384Type", (PyObject *)st->sha384_type) < 0) { Py_DECREF(st->sha384_type); From 2cfcb12e022f0550ba2776279c654623534e707c Mon Sep 17 00:00:00 2001 From: Mohamed Koubaa Date: Fri, 28 Aug 2020 21:06:03 -0500 Subject: [PATCH 10/15] pep7 --- Modules/sha512module.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Modules/sha512module.c b/Modules/sha512module.c index 165e9f200257fd..edd35d64744afd 100644 --- a/Modules/sha512module.c +++ b/Modules/sha512module.c @@ -434,11 +434,13 @@ static inline SHA512State* sha512_get_state(PyObject *module) return (SHA512State *)state; } -static SHAobject *newSHA384object(SHA512State *st) { +static SHAobject *newSHA384object(SHA512State *st) +{ return (SHAobject *)PyObject_New(SHAobject, st->sha384_type); } -static SHAobject *newSHA512object(SHA512State *st) { +static SHAobject *newSHA512object(SHA512State *st) +{ return (SHAobject *)PyObject_New(SHAobject, st->sha512_type); } From 4bcb57f404ae460e4efabe08e34f07948e0a78b0 Mon Sep 17 00:00:00 2001 From: Mohamed Koubaa Date: Sat, 29 Aug 2020 11:08:02 -0500 Subject: [PATCH 11/15] fix dealloc function --- Modules/md5module.c | 2 +- Modules/sha1module.c | 2 +- Modules/sha512module.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/md5module.c b/Modules/md5module.c index 8da2ec6f265fa0..b261ab4cd20175 100644 --- a/Modules/md5module.c +++ b/Modules/md5module.c @@ -340,7 +340,7 @@ newMD5object(MD5State * st) static void MD5_dealloc(PyObject *ptr) { - PyObject *tp = Py_TYPE(ptr); + PyTypeObject *tp = Py_TYPE(ptr); PyObject_Del(ptr); Py_DECREF(tp); } diff --git a/Modules/sha1module.c b/Modules/sha1module.c index 6af2bcbe938b0d..4a4a377d0c7e8a 100644 --- a/Modules/sha1module.c +++ b/Modules/sha1module.c @@ -318,7 +318,7 @@ newSHA1object(SHA1State *st) static void SHA1_dealloc(PyObject *ptr) { - PyObject *tp = Py_TYPE(ptr); + PyTypeObject *tp = Py_TYPE(ptr); PyObject_Del(ptr); Py_DECREF(tp); } diff --git a/Modules/sha512module.c b/Modules/sha512module.c index edd35d64744afd..d6bb040c870feb 100644 --- a/Modules/sha512module.c +++ b/Modules/sha512module.c @@ -449,7 +449,7 @@ static SHAobject *newSHA512object(SHA512State *st) static void SHA512_dealloc(PyObject *ptr) { - PyObject *tp = Py_TYPE(ptr); + PyTypeObject *tp = Py_TYPE(ptr); PyObject_Del(ptr); Py_DECREF(tp); } From 3cd5d6e9f3d22593e9980585a909e3a9e3c754ef Mon Sep 17 00:00:00 2001 From: Mohamed Koubaa Date: Tue, 1 Sep 2020 16:55:16 -0500 Subject: [PATCH 12/15] update based on PR review --- ...2020-08-10-16-11-32.bpo-1635741.O0d3ym.rst | 3 ++- Modules/md5module.c | 6 +++-- Modules/sha1module.c | 8 ++++--- Modules/sha512module.c | 23 ++++++++++++------- 4 files changed, 26 insertions(+), 14 deletions(-) diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-08-10-16-11-32.bpo-1635741.O0d3ym.rst b/Misc/NEWS.d/next/Core and Builtins/2020-08-10-16-11-32.bpo-1635741.O0d3ym.rst index be6c05a59b7e9b..f2ee49974d1dd0 100644 --- a/Misc/NEWS.d/next/Core and Builtins/2020-08-10-16-11-32.bpo-1635741.O0d3ym.rst +++ b/Misc/NEWS.d/next/Core and Builtins/2020-08-10-16-11-32.bpo-1635741.O0d3ym.rst @@ -1 +1,2 @@ -Port :mod:`sha1`, :mod:`sha512`, and :mod:`md5` to multi-phase init (PEP 489) +Port the :mod:`sha1`, :mod:`sha512`, and :mod:`md5` extension modules +to multi-phase initialization API (:pep:`489`). diff --git a/Modules/md5module.c b/Modules/md5module.c index b261ab4cd20175..2f556e515f2b3a 100644 --- a/Modules/md5module.c +++ b/Modules/md5module.c @@ -322,7 +322,8 @@ typedef struct { PyTypeObject* md5_type; } MD5State; -static inline MD5State* md5_get_state(PyObject *module) +static inline MD5State* +md5_get_state(PyObject *module) { void *state = PyModule_GetState(module); assert(state != NULL); @@ -563,7 +564,8 @@ _md5_free(void *module) } /* Initialize this module. */ -static int md5_exec(PyObject *m) +static int +md5_exec(PyObject *m) { MD5State *st = md5_get_state(m); diff --git a/Modules/sha1module.c b/Modules/sha1module.c index 4a4a377d0c7e8a..9eab8b7e8ddc28 100644 --- a/Modules/sha1module.c +++ b/Modules/sha1module.c @@ -299,7 +299,8 @@ typedef struct { PyTypeObject* sha1_type; } SHA1State; -static inline SHA1State* sha1_get_state(PyObject *module) +static inline SHA1State* +sha1_get_state(PyObject *module) { void *state = PyModule_GetState(module); assert(state != NULL); @@ -540,7 +541,8 @@ _sha1_free(void *module) _sha1_clear((PyObject *)module); } -static int sha1_exec(PyObject *module) +static int +_sha1_exec(PyObject *module) { SHA1State* st = sha1_get_state(module); @@ -566,7 +568,7 @@ static int sha1_exec(PyObject *module) /* Initialize this module. */ static PyModuleDef_Slot _sha1_slots[] = { - {Py_mod_exec, sha1_exec}, + {Py_mod_exec, _sha1_exec}, {0, NULL} }; diff --git a/Modules/sha512module.c b/Modules/sha512module.c index d6bb040c870feb..297c1a9917b359 100644 --- a/Modules/sha512module.c +++ b/Modules/sha512module.c @@ -427,19 +427,22 @@ typedef struct { PyTypeObject* sha512_type; } SHA512State; -static inline SHA512State* sha512_get_state(PyObject *module) +static inline SHA512State* +sha512_get_state(PyObject *module) { void *state = PyModule_GetState(module); assert(state != NULL); return (SHA512State *)state; } -static SHAobject *newSHA384object(SHA512State *st) +static SHAobject * +newSHA384object(SHA512State *st) { return (SHAobject *)PyObject_New(SHAobject, st->sha384_type); } -static SHAobject *newSHA512object(SHA512State *st) +static SHAobject * +newSHA512object(SHA512State *st) { return (SHAobject *)PyObject_New(SHAobject, st->sha512_type); } @@ -473,11 +476,14 @@ SHA512Type_copy_impl(SHAobject *self, PyTypeObject *cls) SHA512State *st = PyType_GetModuleState(cls); if (Py_IS_TYPE((PyObject*)self, st->sha512_type)) { - if ( (newobj = newSHA512object(st))==NULL) + if ( (newobj = newSHA512object(st))==NULL) { return NULL; - } else { - if ( (newobj = newSHA384object(st))==NULL) + } + } + else { + if ( (newobj = newSHA384object(st))==NULL) { return NULL; + } } SHAcopy(self, newobj); @@ -744,7 +750,8 @@ _sha512_free(void *module) /* Initialize this module. */ -static int sha512_exec(PyObject *m) +static int +_sha512_exec(PyObject *m) { SHA512State* st = sha512_get_state(m); @@ -774,7 +781,7 @@ static int sha512_exec(PyObject *m) } static PyModuleDef_Slot _sha512_slots[] = { - {Py_mod_exec, sha512_exec}, + {Py_mod_exec, _sha512_exec}, {0, NULL} }; From 0244bcfca900d6008b3f9017d0c234df5368c302 Mon Sep 17 00:00:00 2001 From: Mohamed Koubaa Date: Wed, 2 Sep 2020 18:01:44 -0500 Subject: [PATCH 13/15] use defining_class --- Modules/clinic/md5module.c.h | 21 ++++++++++++++++----- Modules/clinic/sha1module.c.h | 21 ++++++++++++++++----- Modules/md5module.c | 8 +++++--- Modules/sha1module.c | 8 +++++--- 4 files changed, 42 insertions(+), 16 deletions(-) diff --git a/Modules/clinic/md5module.c.h b/Modules/clinic/md5module.c.h index c109f9efec6b60..4762f2800d4b82 100644 --- a/Modules/clinic/md5module.c.h +++ b/Modules/clinic/md5module.c.h @@ -9,15 +9,26 @@ PyDoc_STRVAR(MD5Type_copy__doc__, "Return a copy of the hash object."); #define MD5TYPE_COPY_METHODDEF \ - {"copy", (PyCFunction)MD5Type_copy, METH_NOARGS, MD5Type_copy__doc__}, + {"copy", (PyCFunction)(void(*)(void))MD5Type_copy, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, MD5Type_copy__doc__}, static PyObject * -MD5Type_copy_impl(MD5object *self); +MD5Type_copy_impl(MD5object *self, PyTypeObject *cls); static PyObject * -MD5Type_copy(MD5object *self, PyObject *Py_UNUSED(ignored)) +MD5Type_copy(MD5object *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - return MD5Type_copy_impl(self); + PyObject *return_value = NULL; + static const char * const _keywords[] = { NULL}; + static _PyArg_Parser _parser = {":copy", _keywords, 0}; + + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser + )) { + goto exit; + } + return_value = MD5Type_copy_impl(self, cls); + +exit: + return return_value; } PyDoc_STRVAR(MD5Type_digest__doc__, @@ -115,4 +126,4 @@ _md5_md5(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kw exit: return return_value; } -/*[clinic end generated code: output=dbe3abc60086f3ef input=a9049054013a1b77]*/ +/*[clinic end generated code: output=53ff7f22dbaaea36 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/sha1module.c.h b/Modules/clinic/sha1module.c.h index fc37b1ab880ffa..3a3ab58c1233cf 100644 --- a/Modules/clinic/sha1module.c.h +++ b/Modules/clinic/sha1module.c.h @@ -9,15 +9,26 @@ PyDoc_STRVAR(SHA1Type_copy__doc__, "Return a copy of the hash object."); #define SHA1TYPE_COPY_METHODDEF \ - {"copy", (PyCFunction)SHA1Type_copy, METH_NOARGS, SHA1Type_copy__doc__}, + {"copy", (PyCFunction)(void(*)(void))SHA1Type_copy, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, SHA1Type_copy__doc__}, static PyObject * -SHA1Type_copy_impl(SHA1object *self); +SHA1Type_copy_impl(SHA1object *self, PyTypeObject *cls); static PyObject * -SHA1Type_copy(SHA1object *self, PyObject *Py_UNUSED(ignored)) +SHA1Type_copy(SHA1object *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - return SHA1Type_copy_impl(self); + PyObject *return_value = NULL; + static const char * const _keywords[] = { NULL}; + static _PyArg_Parser _parser = {":copy", _keywords, 0}; + + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser + )) { + goto exit; + } + return_value = SHA1Type_copy_impl(self, cls); + +exit: + return return_value; } PyDoc_STRVAR(SHA1Type_digest__doc__, @@ -115,4 +126,4 @@ _sha1_sha1(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject * exit: return return_value; } -/*[clinic end generated code: output=3ddd637ae17e14b3 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=abf1ab2545cea5a2 input=a9049054013a1b77]*/ diff --git a/Modules/md5module.c b/Modules/md5module.c index 2f556e515f2b3a..71cb9b4e6bcd0f 100644 --- a/Modules/md5module.c +++ b/Modules/md5module.c @@ -352,14 +352,16 @@ MD5_dealloc(PyObject *ptr) /*[clinic input] MD5Type.copy + cls: defining_class + Return a copy of the hash object. [clinic start generated code]*/ static PyObject * -MD5Type_copy_impl(MD5object *self) -/*[clinic end generated code: output=596eb36852f02071 input=2c09e6d2493f3079]*/ +MD5Type_copy_impl(MD5object *self, PyTypeObject *cls) +/*[clinic end generated code: output=bf055e08244bf5ee input=d89087dcfb2a8620]*/ { - MD5State *st = PyType_GetModuleState(Py_TYPE(self)); + MD5State *st = PyType_GetModuleState(cls); MD5object *newobj; if ((newobj = newMD5object(st))==NULL) diff --git a/Modules/sha1module.c b/Modules/sha1module.c index 9eab8b7e8ddc28..278515e9cbd305 100644 --- a/Modules/sha1module.c +++ b/Modules/sha1module.c @@ -330,14 +330,16 @@ SHA1_dealloc(PyObject *ptr) /*[clinic input] SHA1Type.copy + cls: defining_class + Return a copy of the hash object. [clinic start generated code]*/ static PyObject * -SHA1Type_copy_impl(SHA1object *self) -/*[clinic end generated code: output=b4e001264620f02a input=b7eae10df6f89b36]*/ +SHA1Type_copy_impl(SHA1object *self, PyTypeObject *cls) +/*[clinic end generated code: output=b32d4461ce8bc7a7 input=6c22e66fcc34c58e]*/ { - SHA1State *st = PyType_GetModuleState(Py_TYPE(self)); + SHA1State *st = PyType_GetModuleState(cls); SHA1object *newobj; if ((newobj = newSHA1object(st)) == NULL) From b66a9654c7316ed265a164dbd53f845aea560fdf Mon Sep 17 00:00:00 2001 From: Mohamed Koubaa Date: Thu, 3 Sep 2020 11:02:55 -0500 Subject: [PATCH 14/15] remove comment --- Modules/md5module.c | 2 -- Modules/sha1module.c | 2 -- Modules/sha512module.c | 2 -- 3 files changed, 6 deletions(-) diff --git a/Modules/md5module.c b/Modules/md5module.c index 71cb9b4e6bcd0f..5cd4e945101321 100644 --- a/Modules/md5module.c +++ b/Modules/md5module.c @@ -481,8 +481,6 @@ static PyType_Slot md5_type_slots[] = { {0,0} }; -// Using PyType_GetModuleState() on this type is safe since -// it cannot be subclassed: it does not have the Py_TPFLAGS_BASETYPE flag. static PyType_Spec md5_type_spec = { .name = "_md5.md5", .basicsize = sizeof(MD5object), diff --git a/Modules/sha1module.c b/Modules/sha1module.c index 278515e9cbd305..c22437de256b66 100644 --- a/Modules/sha1module.c +++ b/Modules/sha1module.c @@ -459,8 +459,6 @@ static PyType_Slot sha1_type_slots[] = { {0,0} }; -// Using PyType_GetModuleState() on this type is safe since -// it cannot be subclassed: it does not have the Py_TPFLAGS_BASETYPE flag. static PyType_Spec sha1_type_spec = { .name = "_sha1.sha1", .basicsize = sizeof(SHA1object), diff --git a/Modules/sha512module.c b/Modules/sha512module.c index 297c1a9917b359..725098def4d062 100644 --- a/Modules/sha512module.c +++ b/Modules/sha512module.c @@ -599,8 +599,6 @@ static PyType_Slot sha512_sha384_type_slots[] = { {0,0} }; -// Using PyType_GetModuleState() on this type is safe since -// it cannot be subclassed: it does not have the Py_TPFLAGS_BASETYPE flag. static PyType_Spec sha512_sha384_type_spec = { .name = "_sha512.sha384", .basicsize = sizeof(SHAobject), From df69769787bdbcb33fb7b1d6d8f3cce92422480f Mon Sep 17 00:00:00 2001 From: Mohamed Koubaa Date: Fri, 4 Sep 2020 20:24:17 -0500 Subject: [PATCH 15/15] fix readme --- .../2020-08-10-16-11-32.bpo-1635741.O0d3ym.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-08-10-16-11-32.bpo-1635741.O0d3ym.rst b/Misc/NEWS.d/next/Core and Builtins/2020-08-10-16-11-32.bpo-1635741.O0d3ym.rst index f2ee49974d1dd0..12af3d01ed8eff 100644 --- a/Misc/NEWS.d/next/Core and Builtins/2020-08-10-16-11-32.bpo-1635741.O0d3ym.rst +++ b/Misc/NEWS.d/next/Core and Builtins/2020-08-10-16-11-32.bpo-1635741.O0d3ym.rst @@ -1,2 +1,2 @@ -Port the :mod:`sha1`, :mod:`sha512`, and :mod:`md5` extension modules +Port the :mod:`_sha1`, :mod:`_sha512`, and :mod:`_md5` extension modules to multi-phase initialization API (:pep:`489`).