diff options
-rw-r--r-- | Modules/posixmodule.c | 28 |
1 files 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 |