From d311538a93f91d94963b4fdaac8e66e3598df64e Mon Sep 17 00:00:00 2001 From: Tim Peters Date: Mon, 30 Aug 2004 17:36:46 +0000 Subject: win32_urandom(): There's no need to copy the generated byte string, so don't. --- Modules/posixmodule.c | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 3eb1ee8..306bce5 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -7239,9 +7239,8 @@ static HCRYPTPROV hCryptProv = 0; static PyObject* win32_urandom(PyObject *self, PyObject *args) { - int howMany = 0; - unsigned char* bytes = NULL; - PyObject* returnVal = NULL; + int howMany; + PyObject* result; /* Read arguments */ if (! PyArg_ParseTuple(args, "i:urandom", &howMany)) @@ -7282,21 +7281,16 @@ win32_urandom(PyObject *self, PyObject *args) } /* Allocate bytes */ - bytes = (unsigned char*)PyMem_Malloc(howMany); - if (bytes == NULL) - return PyErr_NoMemory(); - - /* Get random data */ - if (! pCryptGenRandom(hCryptProv, howMany, bytes)) { - PyMem_Free(bytes); - return win32_error("CryptGenRandom", NULL); + result = PyString_FromStringAndSize(NULL, howMany); + if (result != NULL) { + /* Get random data */ + if (! pCryptGenRandom(hCryptProv, howMany, (unsigned char*) + PyString_AS_STRING(result))) { + Py_DECREF(result); + return win32_error("CryptGenRandom", NULL); + } } - - /* Build return value */ - returnVal = PyString_FromStringAndSize(bytes, howMany); - PyMem_Free(bytes); - - return returnVal; + return result; } #endif -- cgit v0.12