From d311538a93f91d94963b4fdaac8e66e3598df64e Mon Sep 17 00:00:00 2001
From: Tim Peters <tim.peters@gmail.com>
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

