From 16a0a0b0a0b42dd42f2206a864d6325a278796f7 Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Sun, 6 Mar 2011 01:11:03 +0100 Subject: =?UTF-8?q?Issue=20#11391:=20Writing=20to=20a=20mmap=20object=20cr?= =?UTF-8?q?eated=20with=20`mmap.PROT=5FREAD|mmap.PROT=5FEXEC`=20would=20se?= =?UTF-8?q?gfault=20instead=20of=20raising=20a=20TypeError.=20=20Patch=20b?= =?UTF-8?q?y=20Charles-Fran=C3=A7ois=20Natali.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Lib/test/test_mmap.py | 8 ++++++++ Misc/ACKS | 1 + Misc/NEWS | 4 ++++ Modules/mmapmodule.c | 15 ++++++++++----- 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_mmap.py b/Lib/test/test_mmap.py index d6addff..056b9ec 100644 --- a/Lib/test/test_mmap.py +++ b/Lib/test/test_mmap.py @@ -237,6 +237,14 @@ class MmapTests(unittest.TestCase): prot=mmap.PROT_READ, access=mmap.ACCESS_WRITE) f.close() + # Try writting without PROT_WRITE + with open(TESTFN, "r+b") as f: + m = mmap.mmap(f.fileno(), mapsize, prot=~mmap.PROT_WRITE) + self.assertRaises(TypeError, m.write, b"abcdef") + self.assertRaises(TypeError, m.write_byte, 0) + m.close() + + def test_bad_file_desc(self): # Try opening a bad file descriptor... self.assertRaises(mmap.error, mmap.mmap, -2, 4096) diff --git a/Misc/ACKS b/Misc/ACKS index 2ef672e..023fe94 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -560,6 +560,7 @@ Piotr Meyer John Nagle Takahiro Nakayama Travers Naran +Charles-François Natali Fredrik Nehr Trent Nelson Tony Nelson diff --git a/Misc/NEWS b/Misc/NEWS index ed3f72a..9531d90 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -37,6 +37,10 @@ Core and Builtins Library ------- +- Issue #11391: Writing to a mmap object created with + ``mmap.PROT_READ|mmap.PROT_EXEC`` would segfault instead of raising a + TypeError. Patch by Charles-François Natali. + - Issue #11265: asyncore now correctly handles EPIPE, EBADF and EAGAIN errors on accept(), send() and recv(). diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c index c8c8cb2..f484a7a 100644 --- a/Modules/mmapmodule.c +++ b/Modules/mmapmodule.c @@ -1075,17 +1075,22 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict) prot = PROT_READ | PROT_WRITE; break; case ACCESS_DEFAULT: - /* use the specified or default values of flags and prot */ + /* map prot to access type */ + if ((prot & PROT_READ) && (prot & PROT_WRITE)) { + /* ACCESS_DEFAULT */ + } + else if (prot & PROT_WRITE) { + access = ACCESS_WRITE; + } + else { + access = ACCESS_READ; + } break; default: return PyErr_Format(PyExc_ValueError, "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 */ -- cgit v0.12 From 7b50c2c6aed2754f205835420d7450f2e401ebfd Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Sun, 6 Mar 2011 01:47:18 +0100 Subject: Fix buildbot failure following 97a5590b9291 --- Lib/test/test_mmap.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_mmap.py b/Lib/test/test_mmap.py index 056b9ec..0822cc1 100644 --- a/Lib/test/test_mmap.py +++ b/Lib/test/test_mmap.py @@ -237,14 +237,14 @@ class MmapTests(unittest.TestCase): prot=mmap.PROT_READ, access=mmap.ACCESS_WRITE) f.close() - # Try writting without PROT_WRITE + # Try writing with PROT_EXEC and without PROT_WRITE + prot = mmap.PROT_READ | getattr(mmap, 'PROT_EXEC', 0) with open(TESTFN, "r+b") as f: - m = mmap.mmap(f.fileno(), mapsize, prot=~mmap.PROT_WRITE) + m = mmap.mmap(f.fileno(), mapsize, prot=prot) self.assertRaises(TypeError, m.write, b"abcdef") self.assertRaises(TypeError, m.write_byte, 0) m.close() - def test_bad_file_desc(self): # Try opening a bad file descriptor... self.assertRaises(mmap.error, mmap.mmap, -2, 4096) -- cgit v0.12