[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