[3.14] gh-144050: Fix stat.filemode pure Python file type detection (GH-144059) (GH-144073)

(cherry picked from commit fe629262c0)

Co-authored-by: VanshAgarwal24036 <148854295+VanshAgarwal24036@users.noreply.github.com>
This commit is contained in:
Miss Islington (bot) 2026-01-20 13:47:21 +01:00 committed by GitHub
parent 1cfb4192fe
commit 56cf72d626
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 15 additions and 3 deletions

View file

@ -166,9 +166,14 @@ def filemode(mode):
perm = []
for index, table in enumerate(_filemode_table):
for bit, char in table:
if mode & bit == bit:
perm.append(char)
break
if index == 0:
if S_IFMT(mode) == bit:
perm.append(char)
break
else:
if mode & bit == bit:
perm.append(char)
break
else:
if index == 0:
# Unknown filetype

View file

@ -163,6 +163,11 @@ def test_mode(self):
self.statmod.S_IFREG)
self.assertEqual(self.statmod.S_IMODE(st_mode), 0o666)
def test_filemode_does_not_misclassify_random_bits(self):
# gh-144050 regression test
self.assertEqual(self.statmod.filemode(0o77777)[0], "?")
self.assertEqual(self.statmod.filemode(0o177777)[0], "?")
@os_helper.skip_unless_working_chmod
def test_directory(self):
os.mkdir(TESTFN)

View file

@ -0,0 +1,2 @@
Fix :func:`stat.filemode` in the pure-Python implementation to avoid misclassifying
invalid mode values as block devices.