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.
This commit is contained in:
Antoine Pitrou 2011-03-06 02:03:34 +01:00
parent 414596ae8d
commit d6f3a3e3a8
3 changed files with 22 additions and 5 deletions

View File

@ -239,6 +239,14 @@ class MmapTests(unittest.TestCase):
prot=mmap.PROT_READ, access=mmap.ACCESS_WRITE)
f.close()
# 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=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)

View File

@ -40,6 +40,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 #11306: mailbox in certain cases adapts to an inability to open
certain files in read-write mode. Previously it detected this by
checking for EACCES, now it also checks for EROFS.

View File

@ -1154,17 +1154,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 */