diff --git a/Lib/test/test_mmap.py b/Lib/test/test_mmap.py index 91d62754c08..2d87eadd2a5 100644 --- a/Lib/test/test_mmap.py +++ b/Lib/test/test_mmap.py @@ -426,6 +426,13 @@ class MmapTests(unittest.TestCase): return mmap.mmap.__new__(klass, -1, *args, **kwargs) anon_mmap(PAGESIZE) + def test_prot_readonly(self): + mapsize = 10 + open(TESTFN, "wb").write("a"*mapsize) + f = open(TESTFN, "rb") + m = mmap.mmap(f.fileno(), mapsize, prot=mmap.PROT_READ) + self.assertRaises(TypeError, m.write, "foo") + def test_main(): run_unittest(MmapTests) diff --git a/Misc/NEWS b/Misc/NEWS index c4d64ceda64..fdc81c1a539 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -1142,6 +1142,8 @@ Library Extension Modules ----------------- +- Bug #2111: mmap segfaults when trying to write a block opened with PROT_READ + - #2063: correct order of utime and stime in os.times() result on Windows. - Patch #1736: Fix file name handling of _msi.FCICreate. diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c index 49fe7f7c72c..e47211f171a 100644 --- a/Modules/mmapmodule.c +++ b/Modules/mmapmodule.c @@ -1122,6 +1122,10 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict) "mmap invalid access parameter."); } + if (prot == PROT_READ) { + access = ACCESS_READ; + } + #ifdef HAVE_FSTAT # ifdef __VMS /* on OpenVMS we must ensure that all bytes are written to the file */