summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_tarfile.py
diff options
context:
space:
mode:
authorPetr Viktorin <encukou@gmail.com>2023-09-04 13:46:00 (GMT)
committerGitHub <noreply@github.com>2023-09-04 13:46:00 (GMT)
commit40e52c94a27e4cd94b48e8a705914823cbb6afed (patch)
tree1a1225427b31c0a4da207a0ca56cf3b57a39f227 /Lib/test/test_tarfile.py
parentf3b6608ba2b1db6ac449f656bf439bda8d66eb9f (diff)
downloadcpython-40e52c94a27e4cd94b48e8a705914823cbb6afed.zip
cpython-40e52c94a27e4cd94b48e8a705914823cbb6afed.tar.gz
cpython-40e52c94a27e4cd94b48e8a705914823cbb6afed.tar.bz2
gh-107902: Don't test setting suid/sgid on systems that don't support them (GH-108368)
Diffstat (limited to 'Lib/test/test_tarfile.py')
-rw-r--r--Lib/test/test_tarfile.py39
1 files changed, 25 insertions, 14 deletions
diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py
index 0d6ca43..67009a3 100644
--- a/Lib/test/test_tarfile.py
+++ b/Lib/test/test_tarfile.py
@@ -3808,34 +3808,43 @@ 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)
+ 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_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'
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')
@@ -3844,6 +3853,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(
@@ -3854,6 +3864,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