-
-
Notifications
You must be signed in to change notification settings - Fork 33.9k
Description
Bug report
Bug description:
We found a behavioral discrepancy between CPython and PyPy in stat.filemode via fuzz testing. Upon further inspection, we observed this discrepancy attributes to the differences between CPython's C and Python implementation.
Environment
- Python: 3.11.11
- OS: Ubuntu 24.04.3 LTS
Observed Discrepancy
Incorrect file type detection in stat.filemode(mode)
Reproduction
import stat
print(stat.filemode(32767))Output
CPython (default): ?rwsrwsrwt
Cpython (Python impl.): brwsrwsrwt
Root Cause
CPython's _stat.c determines the file type using (mode & S_IFMT) == S_IFBLK.
For 32767, (mode & S_IFMT) == 0o70000 does not match any known file type, so CPython correctly uses ? as the file-type character.
Its pure-Python implementation instead checks: (mode & S_IFBLK) == S_IFBLK. This check incorrectly evaluates true for 32767, causing Python implementation (which in turn affects PyPy) to misclassify the mode as a block device, yielding the wrong prefix b.
CPython versions tested on:
3.11
Operating systems tested on:
Linux