diff options
-rw-r--r-- | Lib/test/test_import.py | 30 | ||||
-rw-r--r-- | Python/import.c | 6 |
2 files changed, 34 insertions, 2 deletions
diff --git a/Lib/test/test_import.py b/Lib/test/test_import.py index dbfadfb7..8196865 100644 --- a/Lib/test/test_import.py +++ b/Lib/test/test_import.py @@ -1,5 +1,6 @@ import unittest import os +import stat import random import shutil import sys @@ -7,7 +8,7 @@ import py_compile import warnings import imp import marshal -from test.support import unlink, TESTFN, unload, run_unittest +from test.support import unlink, TESTFN, unload, run_unittest, TestFailed def remove_files(name): @@ -80,6 +81,32 @@ 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. + oldmask = os.umask(0o022) + sys.path.insert(0, os.curdir) + 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) + fn = fname + 'c' + if not os.path.exists(fn): + fn = fname + 'o' + if not os.path.exists(fn): raise TestFailed("__import__ did " + "not result in creation of either a .pyc or .pyo file") + s = os.stat(fn) + self.assertEquals(stat.S_IMODE(s.st_mode), + stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH) + finally: + os.umask(oldmask) + remove_files(TESTFN) + if TESTFN in sys.modules: del sys.modules[TESTFN] + del sys.path[0] + def testImpModule(self): # Verify that the imp module can correctly load and find .py files import imp @@ -230,6 +257,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 diff --git a/Python/import.c b/Python/import.c index bccb971..2b82587 100644 --- a/Python/import.c +++ b/Python/import.c @@ -930,7 +930,11 @@ write_compiled_module(PyCodeObject *co, char *cpathname, struct stat *srcstat) { FILE *fp; time_t mtime = srcstat->st_mtime; - mode_t mode = srcstat->st_mode; +#ifdef MS_WINDOWS /* since Windows uses different permissions */ + mode_t mode = srcstat->st_mode & ~S_IEXEC; +#else + mode_t mode = srcstat->st_mode & ~S_IXUSR & ~S_IXGRP & ~S_IXOTH; +#endif fp = open_exclusive(cpathname, mode); if (fp == NULL) { |