#3965: on Windows, open() crashes if the filename or the mode is invalid,
and if the filename is a unicode string.

Reviewed by Martin von Loewis.
diff --git a/Objects/fileobject.c b/Objects/fileobject.c
index a8e95a2..b2051d7 100644
--- a/Objects/fileobject.c
+++ b/Objects/fileobject.c
@@ -305,10 +305,17 @@
 #endif
                 /* EINVAL is returned when an invalid filename or
                  * an invalid mode is supplied. */
-		if (errno == EINVAL)
-			PyErr_Format(PyExc_IOError,
-                                     "invalid filename: %s or mode: %s",
-				     name, mode);
+		if (errno == EINVAL) {
+			PyObject *v;
+			char message[100];
+			PyOS_snprintf(message, 100, 
+			    "invalid mode ('%.50s') or filename", mode);
+			v = Py_BuildValue("(isO)", errno, message, f->f_name);
+			if (v != NULL) {
+				PyErr_SetObject(PyExc_IOError, v);
+				Py_DECREF(v);
+			}
+		}
 		else
 			PyErr_SetFromErrnoWithFilenameObject(PyExc_IOError, f->f_name);
 		f = NULL;