# HG changeset patch # Parent 9d51225480966a61b22fc45e62c2d50373d96ca8 Issue #16743: Fix calling mmap() with length=0 on large files for Windows. diff -r 9d5122548096 Lib/test/test_mmap.py --- a/Lib/test/test_mmap.py Sun Dec 16 21:11:35 2012 +0100 +++ b/Lib/test/test_mmap.py Wed Dec 26 13:49:24 2012 +0000 @@ -721,6 +721,13 @@ def test_large_filesize(self): with self._make_test_file(0x17FFFFFFF, b" ") as f: + if sys.maxsize < 0x180000000: + # On 32 bit platforms the file is larger than sys.maxsize so + # mapping the whole file should fail -- Issue #16743 + with self.assertRaises(OverflowError): + mmap.mmap(f.fileno(), 0x180000000, access=mmap.ACCESS_READ) + with self.assertRaises(ValueError): + mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) with mmap.mmap(f.fileno(), 0x10000, access=mmap.ACCESS_READ) as m: self.assertEqual(m.size(), 0x180000000) diff -r 9d5122548096 Modules/mmapmodule.c --- a/Modules/mmapmodule.c Sun Dec 16 21:11:35 2012 +0100 +++ b/Modules/mmapmodule.c Wed Dec 26 13:49:24 2012 +0000 @@ -1376,11 +1376,13 @@ Py_DECREF(m_obj); return NULL; } - if (offset - size > PY_SSIZE_T_MAX) - /* Map area too large to fit in memory */ - m_obj->size = (Py_ssize_t) -1; - else - m_obj->size = (Py_ssize_t) (size - offset); + if (size - offset > (PY_LONG_LONG) PY_SSIZE_T_MAX) { + PyErr_SetString(PyExc_ValueError, + "mmap length is too large"); + Py_DECREF(m_obj); + return NULL; + } + m_obj->size = (Py_ssize_t) (size - offset); } else { m_obj->size = map_size; size = offset + map_size;