https://github.com/python/cpython/commit/fe629262c0db7aa18bad8bf3ac524acd8695739b
commit: fe629262c0db7aa18bad8bf3ac524acd8695739b
branch: main
author: VanshAgarwal24036 <[email protected]>
committer: serhiy-storchaka <[email protected]>
date: 2026-01-20T14:05:42+02:00
summary:

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

files:
A Misc/NEWS.d/next/Library/2026-01-20-16-35-55.gh-issue-144050.0kKFbF.rst
M Lib/stat.py
M Lib/test/test_stat.py

diff --git a/Lib/stat.py b/Lib/stat.py
index ab1b25b9d6351c..214c7917b5e048 100644
--- a/Lib/stat.py
+++ b/Lib/stat.py
@@ -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
diff --git a/Lib/test/test_stat.py b/Lib/test/test_stat.py
index 5fd25d5012c425..a83f7d076f027e 100644
--- a/Lib/test/test_stat.py
+++ b/Lib/test/test_stat.py
@@ -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)
diff --git 
a/Misc/NEWS.d/next/Library/2026-01-20-16-35-55.gh-issue-144050.0kKFbF.rst 
b/Misc/NEWS.d/next/Library/2026-01-20-16-35-55.gh-issue-144050.0kKFbF.rst
new file mode 100644
index 00000000000000..dfc062d023c8f1
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2026-01-20-16-35-55.gh-issue-144050.0kKFbF.rst
@@ -0,0 +1,2 @@
+Fix :func:`stat.filemode` in the pure-Python implementation to avoid 
misclassifying
+invalid mode values as block devices.

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to