diff options
author | Christian Heimes <christian@python.org> | 2019-09-12 13:30:47 (GMT) |
---|---|---|
committer | Stéphane Wirtel <stephane@wirtel.be> | 2019-09-12 13:30:47 (GMT) |
commit | 8c74574e0aaf1a00719fbc9acbdc27a3923520aa (patch) | |
tree | c7fe3a8530b78060e81db3f7948545d9e076e8ed /Modules/_hashopenssl.c | |
parent | a45b0efdeaf27c3f8a630fb8c3670df6f0d42d20 (diff) | |
download | cpython-8c74574e0aaf1a00719fbc9acbdc27a3923520aa.zip cpython-8c74574e0aaf1a00719fbc9acbdc27a3923520aa.tar.gz cpython-8c74574e0aaf1a00719fbc9acbdc27a3923520aa.tar.bz2 |
bpo-38132: Check EVP_DigestUpdate for error (GH-16041)
Diffstat (limited to 'Modules/_hashopenssl.c')
-rw-r--r-- | Modules/_hashopenssl.c | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/Modules/_hashopenssl.c b/Modules/_hashopenssl.c index 798317f..bea7e5e 100644 --- a/Modules/_hashopenssl.c +++ b/Modules/_hashopenssl.c @@ -96,7 +96,7 @@ newEVPobject(void) return retval; } -static void +static int EVP_hash(EVPobject *self, const void *vp, Py_ssize_t len) { unsigned int process; @@ -108,11 +108,12 @@ EVP_hash(EVPobject *self, const void *vp, Py_ssize_t len) process = Py_SAFE_DOWNCAST(len, Py_ssize_t, unsigned int); if (!EVP_DigestUpdate(self->ctx, (const void*)cp, process)) { _setException(PyExc_ValueError); - break; + return -1; } len -= process; cp += process; } + return 0; } /* Internal methods for a hash object */ @@ -243,6 +244,7 @@ static PyObject * EVP_update(EVPobject *self, PyObject *obj) /*[clinic end generated code: output=ec1d55ed2432e966 input=9b30ec848f015501]*/ { + int result; Py_buffer view; GET_BUFFER_VIEW_OR_ERROUT(obj, &view); @@ -255,14 +257,17 @@ EVP_update(EVPobject *self, PyObject *obj) if (self->lock != NULL) { Py_BEGIN_ALLOW_THREADS PyThread_acquire_lock(self->lock, 1); - EVP_hash(self, view.buf, view.len); + result = EVP_hash(self, view.buf, view.len); PyThread_release_lock(self->lock); Py_END_ALLOW_THREADS } else { - EVP_hash(self, view.buf, view.len); + result = EVP_hash(self, view.buf, view.len); } PyBuffer_Release(&view); + + if (result == -1) + return NULL; Py_RETURN_NONE; } @@ -396,6 +401,7 @@ static PyObject * EVPnew(const EVP_MD *digest, const unsigned char *cp, Py_ssize_t len) { + int result = 0; EVPobject *self; if (!digest) { @@ -415,10 +421,14 @@ EVPnew(const EVP_MD *digest, if (cp && len) { if (len >= HASHLIB_GIL_MINSIZE) { Py_BEGIN_ALLOW_THREADS - EVP_hash(self, cp, len); + result = EVP_hash(self, cp, len); Py_END_ALLOW_THREADS } else { - EVP_hash(self, cp, len); + result = EVP_hash(self, cp, len); + } + if (result == -1) { + Py_DECREF(self); + return NULL; } } |