zahinwahab · GitHub

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

Linked PRs

Read the original on github.com ↗