| 
 | 1 | +import errno  | 
1 | 2 | import sys  | 
2 | 3 | import os  | 
3 | 4 | import io  | 
@@ -3823,14 +3824,26 @@ def test_modes(self):  | 
3823 | 3824 |         tmp_filename = os.path.join(TEMPDIR, "tmp.file")  | 
3824 | 3825 |         with open(tmp_filename, 'w'):  | 
3825 | 3826 |             pass  | 
3826 |  | -        new_mode = (os.stat(tmp_filename).st_mode  | 
3827 |  | -                    | stat.S_ISVTX | stat.S_ISGID | stat.S_ISUID)  | 
3828 |  | -        os.chmod(tmp_filename, new_mode)  | 
3829 |  | -        got_mode = os.stat(tmp_filename).st_mode  | 
3830 |  | -        _t_file = 't' if (got_mode & stat.S_ISVTX) else 'x'  | 
3831 |  | -        _suid_file = 's' if (got_mode & stat.S_ISUID) else 'x'  | 
3832 |  | -        _sgid_file = 's' if (got_mode & stat.S_ISGID) else 'x'  | 
3833 |  | -        os.unlink(tmp_filename)  | 
 | 3827 | +        try:  | 
 | 3828 | +            new_mode = (os.stat(tmp_filename).st_mode  | 
 | 3829 | +                        | stat.S_ISVTX | stat.S_ISGID | stat.S_ISUID)  | 
 | 3830 | +            try:  | 
 | 3831 | +                os.chmod(tmp_filename, new_mode)  | 
 | 3832 | +            except OSError as exc:  | 
 | 3833 | +                if exc.errno == getattr(errno, "EFTYPE", 0):  | 
 | 3834 | +                    # gh-108948: On FreeBSD, regular users cannot set  | 
 | 3835 | +                    # the sticky bit.  | 
 | 3836 | +                    self.skipTest("chmod() failed with EFTYPE: "  | 
 | 3837 | +                                  "regular users cannot set sticky bit")  | 
 | 3838 | +                else:  | 
 | 3839 | +                    raise  | 
 | 3840 | + | 
 | 3841 | +            got_mode = os.stat(tmp_filename).st_mode  | 
 | 3842 | +            _t_file = 't' if (got_mode & stat.S_ISVTX) else 'x'  | 
 | 3843 | +            _suid_file = 's' if (got_mode & stat.S_ISUID) else 'x'  | 
 | 3844 | +            _sgid_file = 's' if (got_mode & stat.S_ISGID) else 'x'  | 
 | 3845 | +        finally:  | 
 | 3846 | +            os.unlink(tmp_filename)  | 
3834 | 3847 | 
 
  | 
3835 | 3848 |         os.mkdir(tmp_filename)  | 
3836 | 3849 |         new_mode = (os.stat(tmp_filename).st_mode  | 
 | 
0 commit comments