mirror of https://github.com/python/cpython
gh-111856: Fix os.fstat on windows with FAT32 and exFAT filesystem (GH-112038)
This commit is contained in:
parent
d2f305dfd1
commit
29af7369db
|
@ -0,0 +1,2 @@
|
|||
Fixes :func:`~os.fstat` on file systems that do not support file ID
|
||||
requests. This includes FAT32 and exFAT.
|
|
@ -1239,6 +1239,7 @@ _Py_fstat_noraise(int fd, struct _Py_stat_struct *status)
|
|||
BY_HANDLE_FILE_INFORMATION info;
|
||||
FILE_BASIC_INFO basicInfo;
|
||||
FILE_ID_INFO idInfo;
|
||||
FILE_ID_INFO *pIdInfo = &idInfo;
|
||||
HANDLE h;
|
||||
int type;
|
||||
|
||||
|
@ -1271,15 +1272,19 @@ _Py_fstat_noraise(int fd, struct _Py_stat_struct *status)
|
|||
}
|
||||
|
||||
if (!GetFileInformationByHandle(h, &info) ||
|
||||
!GetFileInformationByHandleEx(h, FileBasicInfo, &basicInfo, sizeof(basicInfo)) ||
|
||||
!GetFileInformationByHandleEx(h, FileIdInfo, &idInfo, sizeof(idInfo))) {
|
||||
!GetFileInformationByHandleEx(h, FileBasicInfo, &basicInfo, sizeof(basicInfo))) {
|
||||
/* The Win32 error is already set, but we also set errno for
|
||||
callers who expect it */
|
||||
errno = winerror_to_errno(GetLastError());
|
||||
return -1;
|
||||
}
|
||||
|
||||
_Py_attribute_data_to_stat(&info, 0, &basicInfo, &idInfo, status);
|
||||
if (!GetFileInformationByHandleEx(h, FileIdInfo, &idInfo, sizeof(idInfo))) {
|
||||
/* Failed to get FileIdInfo, so do not pass it along */
|
||||
pIdInfo = NULL;
|
||||
}
|
||||
|
||||
_Py_attribute_data_to_stat(&info, 0, &basicInfo, pIdInfo, status);
|
||||
return 0;
|
||||
#else
|
||||
return fstat(fd, status);
|
||||
|
|
Loading…
Reference in New Issue