summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCharles-François Natali <neologix@free.fr>2011-11-10 18:12:29 (GMT)
committerCharles-François Natali <neologix@free.fr>2011-11-10 18:12:29 (GMT)
commit0c929d9d397c2a2578a2b016ae9b3d258ab513aa (patch)
treeffd2b8398314f5c52ecb0ce7052351bf57a82d0b
parent1db7c13be1cbf29af66306b471bc826dadb8efa4 (diff)
downloadcpython-0c929d9d397c2a2578a2b016ae9b3d258ab513aa.zip
cpython-0c929d9d397c2a2578a2b016ae9b3d258ab513aa.tar.gz
cpython-0c929d9d397c2a2578a2b016ae9b3d258ab513aa.tar.bz2
Issue #13303: Fix bytecode file default permission.
-rw-r--r--Lib/importlib/_bootstrap.py2
-rw-r--r--Lib/test/test_import.py17
-rw-r--r--Python/import.c11
3 files changed, 13 insertions, 17 deletions
diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py
index 775fa85..209e041 100644
--- a/Lib/importlib/_bootstrap.py
+++ b/Lib/importlib/_bootstrap.py
@@ -88,7 +88,7 @@ def _write_atomic(path, data):
# On POSIX-like platforms, renaming is atomic. id() is used to generate
# a pseudo-random filename.
path_tmp = '{}.{}'.format(path, id(path))
- fd = _os.open(path_tmp, _os.O_EXCL | _os.O_CREAT | _os.O_WRONLY)
+ fd = _os.open(path_tmp, _os.O_EXCL | _os.O_CREAT | _os.O_WRONLY, 0o666)
try:
with _io.FileIO(fd, 'wb') as file:
file.write(data)
diff --git a/Lib/test/test_import.py b/Lib/test/test_import.py
index 338f1d4..86ef40e 100644
--- a/Lib/test/test_import.py
+++ b/Lib/test/test_import.py
@@ -97,25 +97,22 @@ class ImportTests(unittest.TestCase):
@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.
- with temp_umask(0o022):
+ def test_creation_mode(self):
+ mask = 0o022
+ with temp_umask(mask):
sys.path.insert(0, os.curdir)
try:
fname = TESTFN + os.extsep + "py"
create_empty_file(fname)
- os.chmod(fname, (stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH |
- stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH))
__import__(TESTFN)
fn = imp.cache_from_source(fname)
if not os.path.exists(fn):
self.fail("__import__ did not result in creation of "
"either a .pyc or .pyo file")
- s = os.stat(fn)
- self.assertEqual(
- stat.S_IMODE(s.st_mode),
- stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH)
+ s = os.stat(fn)
+ # Check that the umask is respected, and the executable bits
+ # aren't set.
+ self.assertEqual(stat.S_IMODE(s.st_mode), 0o666 & ~mask)
finally:
del sys.path[0]
remove_files(TESTFN)
diff --git a/Python/import.c b/Python/import.c
index 5c33b6b..ae1101e 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -1202,12 +1202,10 @@ write_compiled_module(PyCodeObject *co, PyObject *cpathname,
S_IXUSR | S_IXGRP | S_IXOTH |
S_IWUSR | S_IWGRP | S_IWOTH);
PyObject *dirbytes;
-#endif
- int fd;
-#ifndef MS_WINDOWS
PyObject *cpathbytes, *cpathbytes_tmp;
Py_ssize_t cpathbytes_len;
#endif
+ int fd;
PyObject *dirname;
Py_UCS4 *dirsep;
int res, ok;
@@ -1275,7 +1273,7 @@ write_compiled_module(PyCodeObject *co, PyObject *cpathname,
return;
}
cpathbytes_len = PyBytes_GET_SIZE(cpathbytes);
- cpathbytes_tmp = PyBytes_FromStringAndSize(NULL, cpathbytes_len + 6);
+ cpathbytes_tmp = PyBytes_FromStringAndSize(NULL, cpathbytes_len + 4);
if (cpathbytes_tmp == NULL) {
Py_DECREF(cpathbytes);
PyErr_Clear();
@@ -1283,9 +1281,10 @@ write_compiled_module(PyCodeObject *co, PyObject *cpathname,
}
memcpy(PyBytes_AS_STRING(cpathbytes_tmp), PyBytes_AS_STRING(cpathbytes),
cpathbytes_len);
- memcpy(PyBytes_AS_STRING(cpathbytes_tmp) + cpathbytes_len, "XXXXXX", 6);
+ memcpy(PyBytes_AS_STRING(cpathbytes_tmp) + cpathbytes_len, ".tmp", 4);
- fd = mkstemp(PyBytes_AS_STRING(cpathbytes_tmp));
+ fd = open(PyBytes_AS_STRING(cpathbytes_tmp),
+ O_CREAT | O_EXCL | O_WRONLY, 0666);
if (0 <= fd)
fp = fdopen(fd, "wb");
else