Bug report
The functions which read marshalled data from a FILE* never check ferror(), so a genuine I/O error is reported as if the file had simply ended.
>>> import _testcapi, os
>>> os.mkdir('d')
>>> _testcapi.pymarshal_read_object_from_file('d')
Traceback (most recent call last):
...
EOFError: EOF read where object expected
The real error is EISDIR. PyMarshal_ReadLongFromFile(), PyMarshal_ReadShortFromFile() and PyMarshal_ReadLastObjectFromFile() behave the same way.
Signals are not checked either, so a read interrupted by Ctrl-C is reported as EOFError instead of raising KeyboardInterrupt.
Doc/c-api/marshal.rst also documents only EOFError, ValueError and TypeError for these functions, which is inaccurate even today -- MemoryError is raised when the read buffer cannot be allocated.
Related: gh-101006 stopped EOFError from overriding an already set exception, but nothing sets OSError in the first place.
Linked PRs
Reactions are currently unavailable
Bug report
The functions which read marshalled data from a FILE* never check ferror(), so a genuine I/O error is reported as if the file had simply ended.
The real error is EISDIR. PyMarshal_ReadLongFromFile(), PyMarshal_ReadShortFromFile() and PyMarshal_ReadLastObjectFromFile() behave the same way.
Signals are not checked either, so a read interrupted by Ctrl-C is reported as EOFError instead of raising KeyboardInterrupt.
Doc/c-api/marshal.rst also documents only EOFError, ValueError and TypeError for these functions, which is inaccurate even today -- MemoryError is raised when the read buffer cannot be allocated.
Related: gh-101006 stopped EOFError from overriding an already set exception, but nothing sets OSError in the first place.
Linked PRs