Merged revisions 70189 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r70189 | hirokazu.yamamoto | 2009-03-05 23:21:12 +0900 | 4 lines

  Issue #5385: Fixed mmap crash after resize failure on windows.

  Now uses NULL instead of INVALID_HANDLE_VALUE as invalid map handle
  because CreateFileMapping returns NULL when error occurs.
........
diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c
index ca5fa88..95dcfbe 100644
--- a/Modules/mmapmodule.c
+++ b/Modules/mmapmodule.c
@@ -112,7 +112,7 @@
 #ifdef MS_WINDOWS
 	if (m_obj->data != NULL)
 		UnmapViewOfFile (m_obj->data);
-	if (m_obj->map_handle != INVALID_HANDLE_VALUE)
+	if (m_obj->map_handle != NULL)
 		CloseHandle (m_obj->map_handle);
 	if (m_obj->file_handle != INVALID_HANDLE_VALUE)
 		CloseHandle (m_obj->file_handle);
@@ -147,9 +147,9 @@
 		UnmapViewOfFile(self->data);
 		self->data = NULL;
 	}
-	if (self->map_handle != INVALID_HANDLE_VALUE) {
+	if (self->map_handle != NULL) {
 		CloseHandle(self->map_handle);
-		self->map_handle = INVALID_HANDLE_VALUE;
+		self->map_handle = NULL;
 	}
 	if (self->file_handle != INVALID_HANDLE_VALUE) {
 		CloseHandle(self->file_handle);
@@ -173,7 +173,7 @@
 #ifdef MS_WINDOWS
 #define CHECK_VALID(err)						\
 do {									\
-    if (self->map_handle == INVALID_HANDLE_VALUE) {						\
+    if (self->map_handle == NULL) {					\
 	PyErr_SetString(PyExc_ValueError, "mmap closed or invalid");	\
 	return err;							\
     }									\
@@ -441,8 +441,10 @@
 		DWORD off_hi, off_lo, newSizeLow, newSizeHigh;
 		/* First, unmap the file view */
 		UnmapViewOfFile(self->data);
+		self->data = NULL;
 		/* Close the mapping object */
 		CloseHandle(self->map_handle);
+		self->map_handle = NULL;
 		/* Move to the desired EOF position */
 #if SIZEOF_SIZE_T > 4
 		newSizeHigh = (DWORD)((self->offset + new_size) >> 32);
@@ -479,6 +481,8 @@
 				return Py_None;
 			} else {
 				dwErrCode = GetLastError();
+				CloseHandle(self->map_handle);
+				self->map_handle = NULL;
 			}
 		} else {
 			dwErrCode = GetLastError();
@@ -1279,7 +1283,7 @@
 	   destruct the object in the face of failure */
 	m_obj->data = NULL;
 	m_obj->file_handle = INVALID_HANDLE_VALUE;
-	m_obj->map_handle = INVALID_HANDLE_VALUE;
+	m_obj->map_handle = NULL;
 	m_obj->tagname = NULL;
 	m_obj->offset = offset;
 
@@ -1376,8 +1380,11 @@
 						     m_obj->size);
 		if (m_obj->data != NULL)
 			return (PyObject *)m_obj;
-		else
+		else {
 			dwErr = GetLastError();
+			CloseHandle(m_obj->map_handle);
+			m_obj->map_handle = NULL;
+		}
 	} else
 		dwErr = GetLastError();
 	Py_DECREF(m_obj);