[pypy-svn] pypy default: Fix two crashers in mmap on windows

amauryfa commits-noreply at bitbucket.org
Thu Feb 17 20:07:58 CET 2011


Author: Amaury Forgeot d'Arc <amauryfa at gmail.com>
Branch: 
Changeset: r42121:f1b2c255611b
Date: 2011-02-17 20:01 +0100
http://bitbucket.org/pypy/pypy/changeset/f1b2c255611b/

Log:	Fix two crashers in mmap on windows

diff --git a/pypy/rlib/test/test_rmmap.py b/pypy/rlib/test/test_rmmap.py
--- a/pypy/rlib/test/test_rmmap.py
+++ b/pypy/rlib/test/test_rmmap.py
@@ -1,6 +1,7 @@
 from pypy.tool.udir import udir
-import os
+import os, sys
 from pypy.rpython.test.test_llinterp import interpret
+from pypy.rlib.rarithmetic import intmask
 from pypy.rlib import rmmap as mmap
 from pypy.rlib.rmmap import RTypeError, RValueError, alloc, free
 
@@ -312,7 +313,6 @@
         f.close()
     
     def test_resize(self):
-        import sys
         if ("darwin" in sys.platform) or ("freebsd" in sys.platform):
             skip("resize does not work under OSX or FreeBSD")
         
@@ -325,10 +325,10 @@
         def func(no):
             m = mmap.mmap(no, 6, access=mmap.ACCESS_WRITE)
             f_size = os.fstat(no).st_size
-            assert m.file_size() == f_size == 6
+            assert intmask(m.file_size()) == f_size == 6
             m.resize(10)
             f_size = os.fstat(no).st_size
-            assert m.file_size() == f_size == 10
+            assert intmask(m.file_size()) == f_size == 10
             m.close()
 
         interpret(func, [f.fileno()])
@@ -417,6 +417,34 @@
 
         compile(func, [int])
 
+    def test_windows_crasher_1(self):
+        if sys.platform != "win32":
+            skip("Windows-only test")
+
+        m = mmap.mmap(-1, 1000, tagname="foo")
+        # same tagname, but larger size
+        try:
+            m2 = mmap.mmap(-1, 5000, tagname="foo")
+            m2.getitem(4500)
+        except WindowsError:
+            pass
+        m.close()
+
+    def test_windows_crasher_2(self):
+        if sys.platform != "win32":
+            skip("Windows-only test")
+
+        f = open(self.tmpname + "t", "w+")
+        f.write("foobar")
+        f.flush()
+
+        f = open(self.tmpname + "t", "r+b")
+        m = mmap.mmap(f.fileno(), 0)
+        f.close()
+        raises(WindowsError, m.resize, 0)
+        raises(RValueError, m.getitem, 0)
+        m.close()
+
 def test_alloc_free():
     map_size = 65536
     data = alloc(map_size)

diff --git a/pypy/rlib/rmmap.py b/pypy/rlib/rmmap.py
--- a/pypy/rlib/rmmap.py
+++ b/pypy/rlib/rmmap.py
@@ -561,7 +561,11 @@
                     charp = rffi.cast(LPCSTR, data)
                     self.setdata(charp, newsize)
                     return
-            raise rwin32.lastWindowsError()
+            winerror = rwin32.lastWindowsError()
+            if self.map_handle:
+                rwin32.CloseHandle(self.map_handle)
+            self.map_handle = INVALID_HANDLE
+            raise winerror
 
     def len(self):
         self.check_valid()
@@ -784,13 +788,17 @@
 
         if m.map_handle:
             data = MapViewOfFile(m.map_handle, dwDesiredAccess,
-                                 offset_hi, offset_lo, 0)
+                                 offset_hi, offset_lo, length)
             if data:
                 # XXX we should have a real LPVOID which must always be casted
                 charp = rffi.cast(LPCSTR, data)
                 m.setdata(charp, map_size)
                 return m
-        raise rwin32.lastWindowsError()
+        winerror = rwin32.lastWindowsError()
+        if m.map_handle:
+            rwin32.CloseHandle(m.map_handle)
+        m.map_handle = INVALID_HANDLE
+        raise winerror
 
     def alloc(map_size):
         """Allocate memory.  This is intended to be used by the JIT,


More information about the Pypy-commit mailing list