adang1345 / PythonWin7

Python 3.9+ installers that support Windows 7 SP1 and Windows Server 2008 R2 SP1
MIT License
580 stars 70 forks source link

python 3.12: os.fstat() raises WinError 87 #19

Closed jknockel closed 1 year ago

jknockel commented 1 year ago

Here is an example reproducer:

>>> import os
>>> os.stat('c:\\windows\\notepad.exe')
os.stat_result(st_mode=33279, st_ino=281474976770376, st_dev=3158229071, st_nlink=2, st_uid=0, st_gid=0, st_size=193024, st_atime=1464830981, st_mtime=1464830981, st_ctime=1464830981)
>>> f = open('c:\\windows\\notepad.exe', 'rb')
>>> f.fileno()
3
>>> os.fstat(f.fileno())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [WinError 87] The parameter is incorrect

I did not observe this issue with python 3.11.

adang1345 commented 1 year ago

I suspect that https://github.com/python/cpython/pull/102149 may have introduced an incompatibility with Windows 7. I'll see if I can add a patch that fixes this.

adang1345 commented 1 year ago

It turns out that this bug is not isolated to Windows 7. Any file system or OS that does not support the FileIdInfo argument to GetFileInformationByHandleEx() will trigger this error. The error happens on Windows 7 because the OS does not support FileIdInfo. The error also happens on recent versions of Windows with the official Python 3.12.0 release if the file is on a FAT32 or exFAT file system.

I reported the bug at https://github.com/python/cpython/issues/111856. In the meantime I will rebuild Python 3.12.0 with a fix.

adang1345 commented 1 year ago

I have uploaded a fixed version of Python 3.12.0.