]> granicus.if.org Git - python/commitdiff
Issue #11391: Writing to a mmap object created with
authorAntoine Pitrou <solipsis@pitrou.net>
Sun, 6 Mar 2011 00:11:03 +0000 (01:11 +0100)
committerAntoine Pitrou <solipsis@pitrou.net>
Sun, 6 Mar 2011 00:11:03 +0000 (01:11 +0100)
`mmap.PROT_READ|mmap.PROT_EXEC` would segfault instead of raising a
TypeError.  Patch by Charles-François Natali.

Lib/test/test_mmap.py
Misc/ACKS
Misc/NEWS
Modules/mmapmodule.c

index d6addff0a3886ee3d7aba067968f5ad55147e17c..056b9ec7f3a48a91f7abdd1a56206be3d095bf07 100644 (file)
@@ -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)
index 2ef672e34431589505e662210464f543e98587c3..023fe9476f9deddd38cb7dadb7b4d8577296df46 100644 (file)
--- 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
index ed3f72af28f0c3fba28552b7499fda820340c01a..9531d908c3111849591e5429fb6bc5907fe8fbb2 100644 (file)
--- 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().
 
index c8c8cb221a759b31ddb0559f006559783857078b..f484a7a75bce5a5687b6a012f625a8687e8323cd 100644 (file)
@@ -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 */