]> granicus.if.org Git - python/commitdiff
Issue 6070: when creating a compiled file, after copying the mode bits, on
authorR. David Murray <rdmurray@bitdance.com>
Tue, 7 Jul 2009 01:06:13 +0000 (01:06 +0000)
committerR. David Murray <rdmurray@bitdance.com>
Tue, 7 Jul 2009 01:06:13 +0000 (01:06 +0000)
posix zap the execute bit in case it was set on the .py file, since the
compiled files are not directly executable on posix.  Patch by Marco N.

Lib/test/test_import.py
Misc/NEWS
Python/import.c

index 9b75b04bce0ec2296f92d81c6d5a84964fc968ef..ea15f011b46d951b01f8412e4742e4dfd424d748 100644 (file)
@@ -1,5 +1,6 @@
 import unittest
 import os
+import stat
 import random
 import shutil
 import sys
@@ -91,6 +92,23 @@ class ImportTest(unittest.TestCase):
         finally:
             del sys.path[0]
 
+    @unittest.skipUnless(os.name == 'posix', "test meaningful only on posix systems")
+    def test_execute_bit_not_copied(self):
+        # Issue 6070: under posix .pyc files got their execute bit set if
+        # the .py file had the execute bit set, but they aren't executable.
+        try:
+            fname = TESTFN + os.extsep + "py"
+            f = open(fname, 'w').close()
+            os.chmod(fname, (stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH |
+                             stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH))
+            __import__(TESTFN)
+            s = os.stat(fname + 'c')
+            self.assertEquals(stat.S_IMODE(s.st_mode),
+                              stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH)
+        finally:
+            remove_files(TESTFN)
+            del sys.modules[TESTFN]
+
     def testImpModule(self):
         # Verify that the imp module can correctly load and find .py files
         import imp
@@ -232,6 +250,7 @@ class ImportTest(unittest.TestCase):
         else:
             self.fail("import by path didn't raise an exception")
 
+
 class TestPycRewriting(unittest.TestCase):
     # Test that the `co_filename` attribute on code objects always points
     # to the right file, even when various things happen (e.g. both the .py
index 65efcfcbb29d9212b459e32804ce2b7e9def6245..4b88981c9b21576644454eeed2fb543349764eec 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,9 @@ What's New in Python 2.7 alpha 1
 Core and Builtins
 -----------------
 
+- Issue 6070: On posix platforms import no longer copies the execute bit
+  from the .py file to the .pyc file if it is set.  Patch by Marco N.
+
 - Issue #4618: When unicode arguments are passed to print(), the default
   separator and end should be unicode also.
 
index 88aced06d102799a2ddf7a6d1a30eaa11a3880f8..46a1acc6a269fffcd097ea45130d702ca2d8265b 100644 (file)
@@ -881,7 +881,9 @@ write_compiled_module(PyCodeObject *co, char *cpathname, struct stat *srcstat)
 {
        FILE *fp;
        time_t mtime = srcstat->st_mtime;
-       mode_t mode = srcstat->st_mode;
+#ifndef MS_WINDOWS
+       mode_t mode = srcstat->st_mode & ~S_IXUSR & ~S_IXGRP & ~S_IXOTH;
+#endif 
 
        fp = open_exclusive(cpathname, mode);
        if (fp == NULL) {