]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Merged revisions 70189 via svnmerge from
authorHirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
Thu, 5 Mar 2009 14:33:01 +0000 (14:33 +0000)
committerHirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
Thu, 5 Mar 2009 14:33:01 +0000 (14:33 +0000)
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.
........

Lib/test/test_mmap.py
Misc/NEWS
Modules/mmapmodule.c

index 73982270f07c07791403ff6f7e8664413874fa1f..618d6c2cafc284aae813825a7f2789b62800ff22 100644 (file)
@@ -509,6 +509,7 @@ class MmapTests(unittest.TestCase):
             data1 = b"0123456789"
             data2 = b"abcdefghij"
             assert len(data1) == len(data2)
+
             # Test same tag
             m1 = mmap.mmap(-1, len(data1), tagname="foo")
             m1[:] = data1
@@ -516,6 +517,9 @@ class MmapTests(unittest.TestCase):
             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
@@ -523,14 +527,42 @@ class MmapTests(unittest.TestCase):
             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():
index 83e5874c3e39f9ca81caafbef84bcf6f28893368..24b87291efa2d88a904bd835490616ae15042ac0 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -183,6 +183,8 @@ Core and Builtins
 Library
 -------
 
+- Issue #5385: Fixed mmap crash after resize failure on windows.
+
 - Issue #5179: Fixed subprocess handle leak on failure on windows.
 
 - PEP 372:  Added collections.OrderedDict().
index d214b62cc4fa2368d33842ff9496f1c3c7214729..45da96f397f322a77802252857ad3b03958a18bd 100644 (file)
@@ -113,7 +113,7 @@ mmap_object_dealloc(mmap_object *m_obj)
 #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);
@@ -153,9 +153,9 @@ mmap_close_method(mmap_object *self, PyObject *unused)
                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);
@@ -179,7 +179,7 @@ mmap_close_method(mmap_object *self, PyObject *unused)
 #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;                                                     \
     }                                                                  \
@@ -452,8 +452,10 @@ mmap_resize_method(mmap_object *self,
                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);
@@ -490,6 +492,8 @@ mmap_resize_method(mmap_object *self,
                                return Py_None;
                        } else {
                                dwErrCode = GetLastError();
+                               CloseHandle(self->map_handle);
+                               self->map_handle = NULL;
                        }
                } else {
                        dwErrCode = GetLastError();
@@ -1202,7 +1206,7 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict)
           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;
 
@@ -1300,8 +1304,11 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict)
                                                     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);