Commit 16a0a0b0 authored by Antoine Pitrou's avatar Antoine Pitrou

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.
parent 3c2ccf29
...@@ -237,6 +237,14 @@ class MmapTests(unittest.TestCase): ...@@ -237,6 +237,14 @@ class MmapTests(unittest.TestCase):
prot=mmap.PROT_READ, access=mmap.ACCESS_WRITE) prot=mmap.PROT_READ, access=mmap.ACCESS_WRITE)
f.close() 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): def test_bad_file_desc(self):
# Try opening a bad file descriptor... # Try opening a bad file descriptor...
self.assertRaises(mmap.error, mmap.mmap, -2, 4096) self.assertRaises(mmap.error, mmap.mmap, -2, 4096)
......
...@@ -560,6 +560,7 @@ Piotr Meyer ...@@ -560,6 +560,7 @@ Piotr Meyer
John Nagle John Nagle
Takahiro Nakayama Takahiro Nakayama
Travers Naran Travers Naran
Charles-François Natali
Fredrik Nehr Fredrik Nehr
Trent Nelson Trent Nelson
Tony Nelson Tony Nelson
......
...@@ -37,6 +37,10 @@ Core and Builtins ...@@ -37,6 +37,10 @@ Core and Builtins
Library 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 - Issue #11265: asyncore now correctly handles EPIPE, EBADF and EAGAIN errors
on accept(), send() and recv(). on accept(), send() and recv().
......
...@@ -1075,17 +1075,22 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict) ...@@ -1075,17 +1075,22 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict)
prot = PROT_READ | PROT_WRITE; prot = PROT_READ | PROT_WRITE;
break; break;
case ACCESS_DEFAULT: 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; break;
default: default:
return PyErr_Format(PyExc_ValueError, return PyErr_Format(PyExc_ValueError,
"mmap invalid access parameter."); "mmap invalid access parameter.");
} }
if (prot == PROT_READ) {
access = ACCESS_READ;
}
#ifdef HAVE_FSTAT #ifdef HAVE_FSTAT
# ifdef __VMS # ifdef __VMS
/* on OpenVMS we must ensure that all bytes are written to the file */ /* on OpenVMS we must ensure that all bytes are written to the file */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment