Index: Lib/test/test_mmap.py =================================================================== --- Lib/test/test_mmap.py (revision 70085) +++ Lib/test/test_mmap.py (working copy) @@ -504,6 +504,7 @@ data1 = "0123456789" data2 = "abcdefghij" assert len(data1) == len(data2) + # Test same tag m1 = mmap.mmap(-1, len(data1), tagname="foo") m1[:] = data1 @@ -511,6 +512,9 @@ m2[:] = data2 self.assertEquals(m1[:], data2) self.assertEquals(m2[:], data2) + m2.close() + m1.close() + # Test differnt tag m1 = mmap.mmap(-1, len(data1), tagname="foo") m1[:] = data1 @@ -518,16 +522,44 @@ m2[:] = data2 self.assertEquals(m1[:], data1) self.assertEquals(m2[:], data2) + m2.close() + m1.close() - def test_tagname_crash(self): + def test_crasher_on_windows(self): # Should not crash (Issue 1733986) m = mmap.mmap(-1, 1000, tagname="foo") try: mmap.mmap(-1, 5000, tagname="foo")[:] # same tagname, but larger size except: pass + m.close() + # Should not crash (Issue 5385) + m = mmap.mmap(-1, 1000) + try: + m.resize(0) + except: + pass + try: + m[:] + except: + pass + m.close() + m1 = mmap.mmap(-1, 1000) + m2 = mmap.mmap(-1, 1000) + try: + m2.resize(5000) + except: + pass + try: + m2[:] + except: + pass + m2.close() + m1.close() + + def test_main(): run_unittest(MmapTests) Index: Modules/mmapmodule.c =================================================================== --- Modules/mmapmodule.c (revision 70085) +++ Modules/mmapmodule.c (working copy) @@ -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);