diff --git a/Lib/test/test_import.py b/Lib/test/test_import.py index 9b75b04bce0..ea15f011b46 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 @@ -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 diff --git a/Misc/NEWS b/Misc/NEWS index 65efcfcbb29..4b88981c9b2 100644 --- 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. diff --git a/Python/import.c b/Python/import.c index 88aced06d10..46a1acc6a26 100644 --- a/Python/import.c +++ b/Python/import.c @@ -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) {