From 26e06ad617bb416201c769fea91cd33d544c6a1c Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 22 Sep 2023 00:59:08 +0200 Subject: [PATCH] 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. --- Lib/test/test_tarfile.py | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py index 9a39dd4a4e5f03..cc26da05daeafc 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 @@ -3823,14 +3824,26 @@ def test_modes(self): tmp_filename = os.path.join(TEMPDIR, "tmp.file") with open(tmp_filename, 'w'): pass - 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) + 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) new_mode = (os.stat(tmp_filename).st_mode