win32_urandom():  There's no need to copy the generated byte string, so
don't.
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 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 @@
 	}
 
 	/* 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