summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPetr Viktorin <encukou@gmail.com>2024-10-22 11:11:11 (GMT)
committerGitHub <noreply@github.com>2024-10-22 11:11:11 (GMT)
commit6bbaab801b0df24a966a35ca1ba775232d5d3308 (patch)
tree902115782774edfbd3107914a0d767faa2f70416
parentb11623759252c348755072df405271d85c1ec147 (diff)
downloadcpython-6bbaab801b0df24a966a35ca1ba775232d5d3308.zip
cpython-6bbaab801b0df24a966a35ca1ba775232d5d3308.tar.gz
cpython-6bbaab801b0df24a966a35ca1ba775232d5d3308.tar.bz2
[3.10] gh-107902: gh-108948: Don't test setting suid/sgid/sticky on systems that don't support them (GH-108368) (GH-109697) (#125255)
* gh-107902: Don't test setting suid/sgid on systems that don't support them (GH-108368) * gh-108948: Skip test_tarfile.test_modes() on EFTYPE error (#109697) On FreeBSD, regular users cannot set the sticky bit. Skip the test if chmod() fails with EFTYPE error. --------- Co-authored-by: Victor Stinner <vstinner@python.org>
-rw-r--r--Lib/test/test_tarfile.py54
1 files changed, 39 insertions, 15 deletions
diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py
index 007c3e9..63ab254 100644
--- a/Lib/test/test_tarfile.py
+++ b/Lib/test/test_tarfile.py
@@ -1,3 +1,4 @@
+import errno
import sys
import os
import io
@@ -3691,34 +3692,55 @@ class TestExtractionFilters(unittest.TestCase):
arc.add('read_group_only', mode='?---r-----')
arc.add('no_bits', mode='?---------')
arc.add('dir/', mode='?---rwsrwt')
+ arc.add('dir_all_bits/', mode='?rwsrwsrwt')
- # On some systems, setting the sticky bit is a no-op.
- # Check if that's the case.
+ # On some systems, setting the uid, gid, and/or sticky bit is a no-ops.
+ # Check which bits we can set, so we can compare tarfile machinery to
+ # a simple chmod.
tmp_filename = os.path.join(TEMPDIR, "tmp.file")
with open(tmp_filename, 'w'):
pass
- os.chmod(tmp_filename, os.stat(tmp_filename).st_mode | stat.S_ISVTX)
- have_sticky_files = (os.stat(tmp_filename).st_mode & stat.S_ISVTX)
- os.unlink(tmp_filename)
+ try:
+ new_mode = (os.stat(tmp_filename).st_mode
+ | stat.S_ISVTX | stat.S_ISGID | stat.S_ISUID)
+ try:
+ os.chmod(tmp_filename, new_mode)
+ except OSError as exc:
+ if exc.errno == getattr(errno, "EFTYPE", 0):
+ # gh-108948: On FreeBSD, regular users cannot set
+ # the sticky bit.
+ self.skipTest("chmod() failed with EFTYPE: "
+ "regular users cannot set sticky bit")
+ else:
+ raise
+
+ got_mode = os.stat(tmp_filename).st_mode
+ _t_file = 't' if (got_mode & stat.S_ISVTX) else 'x'
+ _suid_file = 's' if (got_mode & stat.S_ISUID) else 'x'
+ _sgid_file = 's' if (got_mode & stat.S_ISGID) else 'x'
+ finally:
+ os.unlink(tmp_filename)
os.mkdir(tmp_filename)
- os.chmod(tmp_filename, os.stat(tmp_filename).st_mode | stat.S_ISVTX)
- have_sticky_dirs = (os.stat(tmp_filename).st_mode & stat.S_ISVTX)
+ new_mode = (os.stat(tmp_filename).st_mode
+ | stat.S_ISVTX | stat.S_ISGID | stat.S_ISUID)
+ os.chmod(tmp_filename, new_mode)
+ got_mode = os.stat(tmp_filename).st_mode
+ _t_dir = 't' if (got_mode & stat.S_ISVTX) else 'x'
+ _suid_dir = 's' if (got_mode & stat.S_ISUID) else 'x'
+ _sgid_dir = 's' if (got_mode & stat.S_ISGID) else 'x'
os.rmdir(tmp_filename)
with self.check_context(arc.open(), 'fully_trusted'):
- if have_sticky_files:
- self.expect_file('all_bits', mode='?rwsrwsrwt')
- else:
- self.expect_file('all_bits', mode='?rwsrwsrwx')
+ self.expect_file('all_bits',
+ mode=f'?rw{_suid_file}rw{_sgid_file}rw{_t_file}')
self.expect_file('perm_bits', mode='?rwxrwxrwx')
self.expect_file('exec_group_other', mode='?rw-rwxrwx')
self.expect_file('read_group_only', mode='?---r-----')
self.expect_file('no_bits', mode='?---------')
- if have_sticky_dirs:
- self.expect_file('dir/', mode='?---rwsrwt')
- else:
- self.expect_file('dir/', mode='?---rwsrwx')
+ self.expect_file('dir/', mode=f'?---rw{_sgid_dir}rw{_t_dir}')
+ self.expect_file('dir_all_bits/',
+ mode=f'?rw{_suid_dir}rw{_sgid_dir}rw{_t_dir}')
with self.check_context(arc.open(), 'tar'):
self.expect_file('all_bits', mode='?rwxr-xr-x')
@@ -3727,6 +3749,7 @@ class TestExtractionFilters(unittest.TestCase):
self.expect_file('read_group_only', mode='?---r-----')
self.expect_file('no_bits', mode='?---------')
self.expect_file('dir/', mode='?---r-xr-x')
+ self.expect_file('dir_all_bits/', mode='?rwxr-xr-x')
with self.check_context(arc.open(), 'data'):
normal_dir_mode = stat.filemode(stat.S_IMODE(
@@ -3737,6 +3760,7 @@ class TestExtractionFilters(unittest.TestCase):
self.expect_file('read_group_only', mode='?rw-r-----')
self.expect_file('no_bits', mode='?rw-------')
self.expect_file('dir/', mode=normal_dir_mode)
+ self.expect_file('dir_all_bits/', mode=normal_dir_mode)
def test_pipe(self):
# Test handling of a special file