Fix [ 616716 ] Bug in PyErr_SetExcFromWindows

Ensure that even if FormatMessage fails we (a) don't crash, and (b) provide something useful.

Bugfix candidate.
diff --git a/Python/errors.c b/Python/errors.c
index 9a2597b..95c24a6 100644
--- a/Python/errors.c
+++ b/Python/errors.c
@@ -269,6 +269,7 @@
 #endif
 #ifdef MS_WINDOWS
 	char *s_buf = NULL;
+	char s_small_buf[28]; /* Room for "Windows Error 0xFFFFFFFF" */
 #endif
 #ifdef EINTR
 	if (i == EINTR && PyErr_CheckSignals())
@@ -306,10 +307,18 @@
 				(LPTSTR) &s_buf,
 				0,	/* size not used */
 				NULL);	/* no args */
-			s = s_buf;
-			/* remove trailing cr/lf and dots */
-			while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.'))
-				s[--len] = '\0';
+			if (len==0) {
+				/* Only ever seen this in out-of-mem 
+				   situations */
+				sprintf(s_small_buf, "Windows Error 0x%X", i);
+				s = s_small_buf;
+				s_buf = NULL;
+			} else {
+				s = s_buf;
+				/* remove trailing cr/lf and dots */
+				while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.'))
+					s[--len] = '\0';
+			}
 		}
 	}
 #endif /* Unix/Windows */
@@ -366,6 +375,8 @@
 {
 	int len;
 	char *s;
+	char *s_buf = NULL; /* Free via LocalFree */
+	char s_small_buf[28]; /* Room for "Windows Error 0xFFFFFFFF" */
 	PyObject *v;
 	DWORD err = (DWORD)ierr;
 	if (err==0) err = GetLastError();
@@ -378,12 +389,20 @@
 		err,
 		MAKELANGID(LANG_NEUTRAL,
 		SUBLANG_DEFAULT), /* Default language */
-		(LPTSTR) &s,
+		(LPTSTR) &s_buf,
 		0,	/* size not used */
 		NULL);	/* no args */
-	/* remove trailing cr/lf and dots */
-	while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.'))
-		s[--len] = '\0';
+	if (len==0) {
+		/* Only seen this in out of mem situations */
+		sprintf(s_small_buf, "Windows Error 0x%X", err);
+		s = s_small_buf;
+		s_buf = NULL;
+	} else {
+		s = s_buf;
+		/* remove trailing cr/lf and dots */
+		while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.'))
+			s[--len] = '\0';
+	}
 	if (filenameObject != NULL)
 		v = Py_BuildValue("(isO)", err, s, filenameObject);
 	else
@@ -392,7 +411,7 @@
 		PyErr_SetObject(exc, v);
 		Py_DECREF(v);
 	}
-	LocalFree(s);
+	LocalFree(s_buf);
 	return NULL;
 }