From: Gregory P. Smith Date: Sat, 25 Apr 2015 23:42:38 +0000 (+0000) Subject: Issue9951: update _hashopenssl and md5module to use _Py_strhex(). X-Git-Tag: v3.5.0b1~291 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4dff6f6fa6bfdc14c570d0c6a63021640203e1a6;p=python Issue9951: update _hashopenssl and md5module to use _Py_strhex(). Also update _posixsubprocess to use Py_hexdigits instead of its own constant. --- diff --git a/Modules/_hashopenssl.c b/Modules/_hashopenssl.c index 1566b18991..a157fbb14a 100644 --- a/Modules/_hashopenssl.c +++ b/Modules/_hashopenssl.c @@ -16,6 +16,7 @@ #include "Python.h" #include "structmember.h" #include "hashlib.h" +#include "pystrhex.h" /* EVP is the preferred interface to hashing in OpenSSL */ @@ -157,9 +158,7 @@ EVP_hexdigest(EVPobject *self, PyObject *unused) { unsigned char digest[EVP_MAX_MD_SIZE]; EVP_MD_CTX temp_ctx; - PyObject *retval; - char *hex_digest; - unsigned int i, j, digest_size; + unsigned int digest_size; /* Get the raw (binary) digest value */ locked_EVP_MD_CTX_copy(&temp_ctx, self); @@ -168,22 +167,7 @@ EVP_hexdigest(EVPobject *self, PyObject *unused) EVP_MD_CTX_cleanup(&temp_ctx); - /* Allocate a new buffer */ - hex_digest = PyMem_Malloc(digest_size * 2 + 1); - if (!hex_digest) - return PyErr_NoMemory(); - - /* Make hex version of the digest */ - for(i=j=0; i> 4) & 0xf; - hex_digest[j++] = Py_hexdigits[c]; - c = (digest[i] & 0xf); - hex_digest[j++] = Py_hexdigits[c]; - } - retval = PyUnicode_FromStringAndSize(hex_digest, digest_size * 2); - PyMem_Free(hex_digest); - return retval; + return _Py_strhex((const char *)digest, digest_size); } PyDoc_STRVAR(EVP_update__doc__, diff --git a/Modules/_posixsubprocess.c b/Modules/_posixsubprocess.c index 39914c5ec5..00989bcdca 100644 --- a/Modules/_posixsubprocess.c +++ b/Modules/_posixsubprocess.c @@ -504,7 +504,7 @@ error: _Py_write_noraise(errpipe_write, "OSError:", 8); cur = hex_errno + sizeof(hex_errno); while (saved_errno != 0 && cur > hex_errno) { - *--cur = "0123456789ABCDEF"[saved_errno % 16]; + *--cur = Py_hexdigits[saved_errno % 16]; saved_errno /= 16; } _Py_write_noraise(errpipe_write, cur, hex_errno + sizeof(hex_errno) - cur); diff --git a/Modules/md5module.c b/Modules/md5module.c index 00ee6c3379..a9ebc8cc51 100644 --- a/Modules/md5module.c +++ b/Modules/md5module.c @@ -18,6 +18,7 @@ #include "Python.h" #include "hashlib.h" +#include "pystrhex.h" /*[clinic input] module _md5 @@ -387,32 +388,12 @@ MD5Type_hexdigest_impl(MD5object *self) { unsigned char digest[MD5_DIGESTSIZE]; struct md5_state temp; - PyObject *retval; - Py_UCS1 *hex_digest; - int i, j; /* Get the raw (binary) digest value */ temp = self->hash_state; md5_done(&temp, digest); - /* Create a new string */ - retval = PyUnicode_New(MD5_DIGESTSIZE * 2, 127); - if (!retval) - return NULL; - hex_digest = PyUnicode_1BYTE_DATA(retval); - - /* Make hex version of the digest */ - for(i=j=0; i> 4) & 0xf; - hex_digest[j++] = Py_hexdigits[c]; - c = (digest[i] & 0xf); - hex_digest[j++] = Py_hexdigits[c]; - } -#ifdef Py_DEBUG - assert(_PyUnicode_CheckConsistency(retval, 1)); -#endif - return retval; + return _Py_strhex((const char*)digest, MD5_DIGESTSIZE); } /*[clinic input]