diff options
author | Gregory P. Smith <greg@mad-scientist.com> | 2009-02-12 07:35:29 (GMT) |
---|---|---|
committer | Gregory P. Smith <greg@mad-scientist.com> | 2009-02-12 07:35:29 (GMT) |
commit | 365a1864fd285fc6ee9d9fa1f8770b39d4dab830 (patch) | |
tree | 0fb2cf9664348d80caa3e3ace86b84aa2a3f9080 /Modules/_hashopenssl.c | |
parent | 3072921d0e668e890da1312e0f47f3e7e4854329 (diff) | |
download | cpython-365a1864fd285fc6ee9d9fa1f8770b39d4dab830.zip cpython-365a1864fd285fc6ee9d9fa1f8770b39d4dab830.tar.gz cpython-365a1864fd285fc6ee9d9fa1f8770b39d4dab830.tar.bz2 |
Fixes Issue #3745: Fix hashlib to always reject unicode and non
buffer-api supporting objects as input no matter how it was compiled
(built in implementations or external openssl library).
Diffstat (limited to 'Modules/_hashopenssl.c')
-rw-r--r-- | Modules/_hashopenssl.c | 31 |
1 files changed, 5 insertions, 26 deletions
diff --git a/Modules/_hashopenssl.c b/Modules/_hashopenssl.c index bd15b01..569d441 100644 --- a/Modules/_hashopenssl.c +++ b/Modules/_hashopenssl.c @@ -15,6 +15,7 @@ #include "Python.h" #include "structmember.h" +#include "hashlib.h" /* EVP is the preferred interface to hashing in OpenSSL */ #include <openssl/evp.h> @@ -203,28 +204,6 @@ EVP_hexdigest(EVPobject *self, PyObject *unused) return retval; } -#define MY_GET_BUFFER_VIEW_OR_ERROUT(obj, viewp) do { \ - if (PyUnicode_Check((obj))) { \ - PyErr_SetString(PyExc_TypeError, \ - "Unicode-objects must be encoded before hashing");\ - return NULL; \ - } \ - if (!PyObject_CheckBuffer((obj))) { \ - PyErr_SetString(PyExc_TypeError, \ - "object supporting the buffer API required"); \ - return NULL; \ - } \ - if (PyObject_GetBuffer((obj), (viewp), PyBUF_SIMPLE) == -1) { \ - return NULL; \ - } \ - if ((viewp)->ndim > 1) { \ - PyErr_SetString(PyExc_BufferError, \ - "Buffer must be single dimension"); \ - PyBuffer_Release((viewp)); \ - return NULL; \ - } \ - } while(0); - PyDoc_STRVAR(EVP_update__doc__, "Update this hash object's state with the provided string."); @@ -237,7 +216,7 @@ EVP_update(EVPobject *self, PyObject *args) if (!PyArg_ParseTuple(args, "O:update", &obj)) return NULL; - MY_GET_BUFFER_VIEW_OR_ERROUT(obj, &view); + GET_BUFFER_VIEW_OR_ERROUT(obj, &view); #ifdef WITH_THREAD if (self->lock == NULL && view.len >= HASHLIB_GIL_MINSIZE) { @@ -344,7 +323,7 @@ EVP_tp_init(EVPobject *self, PyObject *args, PyObject *kwds) } if (data_obj) - MY_GET_BUFFER_VIEW_OR_ERROUT(data_obj, &view); + GET_BUFFER_VIEW_OR_ERROUT(data_obj, &view); if (!PyArg_Parse(name_obj, "s", &nameStr)) { PyErr_SetString(PyExc_TypeError, "name must be a string"); @@ -507,7 +486,7 @@ EVP_new(PyObject *self, PyObject *args, PyObject *kwdict) } if (data_obj) - MY_GET_BUFFER_VIEW_OR_ERROUT(data_obj, &view); + GET_BUFFER_VIEW_OR_ERROUT(data_obj, &view); digest = EVP_get_digestbyname(name); @@ -538,7 +517,7 @@ EVP_new(PyObject *self, PyObject *args, PyObject *kwdict) } \ \ if (data_obj) \ - MY_GET_BUFFER_VIEW_OR_ERROUT(data_obj, &view); \ + GET_BUFFER_VIEW_OR_ERROUT(data_obj, &view); \ \ ret_obj = EVPnew( \ CONST_ ## NAME ## _name_obj, \ |