Merged revisions 88022 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/branches/py3k

........
  r88022 | antoine.pitrou | 2011-01-15 17:17:07 +0100 (sam., 15 janv. 2011) | 7 lines

  Issue #10916: mmap should not segfault when a file is mapped using 0 as
  length and a non-zero offset, and an attempt to read past the end of file
  is made (IndexError is raised instead).  Patch by Ross Lagerwall.

  Requested by Georg.
........
This commit is contained in:
Antoine Pitrou 2011-01-15 16:18:37 +00:00
parent 3acd3e97f2
commit fb7bc3d2f0
3 changed files with 18 additions and 1 deletions

View File

@ -324,6 +324,19 @@ class MmapTests(unittest.TestCase):
mf.close()
f.close()
def test_length_0_offset(self):
# Issue #10916: test mapping of remainder of file by passing 0 for
# map length with an offset doesn't cause a segfault.
if not hasattr(os, "stat"):
self.skipTest("needs os.stat")
with open(TESTFN, "wb+") as f:
f.write(49152 * b'm') # Arbitrary character
with open(TESTFN, "rb") as f:
mf = mmap.mmap(f.fileno(), 0, offset=40960, access=mmap.ACCESS_READ)
self.assertRaises(IndexError, mf.__getitem__, 45000)
mf.close()
def test_move(self):
# make move works everywhere (64-bit format problem earlier)
f = open(TESTFN, 'wb+')

View File

@ -34,6 +34,10 @@ Core and Builtins
Library
-------
- Issue #10916: mmap should not segfault when a file is mapped using 0 as
length and a non-zero offset, and an attempt to read past the end of file
is made (IndexError is raised instead). Patch by Ross Lagerwall.
- Issue #10899: No function type annotations in the standard library.
Removed function type annotations from _pyio.py.

View File

@ -1085,7 +1085,7 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict)
# endif
if (fd != -1 && fstat(fd, &st) == 0 && S_ISREG(st.st_mode)) {
if (map_size == 0) {
map_size = st.st_size;
map_size = st.st_size - offset;
} else if ((size_t)offset + (size_t)map_size > st.st_size) {
PyErr_SetString(PyExc_ValueError,
"mmap length is greater than file size");