Skip to content

Discrepancy between stat.filemode's C and Python implementation #144050

@zahinwahab

Description

@zahinwahab

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    3.14bugs and security fixes3.15new features, bugs and security fixesstdlibStandard Library Python modules in the Lib/ directorytype-bugAn unexpected behavior, bug, or error

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions