bpo-38822: Fixed os.stat failing on inaccessible directories. (GH-25527)

It would just fail if the path was inaccessible and had a trailing slash. It should fall back to the parent directory's metadata.
This commit is contained in:
Steve Dower 2021-04-22 20:45:02 +01:00 committed by GitHub
parent 2a3f4899c6
commit fe63a401a9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 24 additions and 2 deletions

View File

@ -0,0 +1,3 @@
Fixed :func:`os.stat` failing on inaccessible directories with a trailing
slash, rather than falling back to the parent directory's metadata. This
implicitly affected :func:`os.path.exists` and :func:`os.path.isdir`.

View File

@ -1851,9 +1851,28 @@ attributes_from_dir(LPCWSTR pszFile, BY_HANDLE_FILE_INFORMATION *info, ULONG *re
{
HANDLE hFindFile;
WIN32_FIND_DATAW FileData;
hFindFile = FindFirstFileW(pszFile, &FileData);
if (hFindFile == INVALID_HANDLE_VALUE)
LPCWSTR filename = pszFile;
size_t n = wcslen(pszFile);
if (n && (pszFile[n - 1] == L'\\' || pszFile[n - 1] == L'/')) {
// cannot use PyMem_Malloc here because we do not hold the GIL
filename = (LPCWSTR)malloc((n + 1) * sizeof(filename[0]));
wcsncpy_s((LPWSTR)filename, n + 1, pszFile, n);
while (--n > 0 && (filename[n] == L'\\' || filename[n] == L'/')) {
((LPWSTR)filename)[n] = L'\0';
}
if (!n || filename[n] == L':') {
// Nothing left te query
free((void *)filename);
return FALSE;
}
}
hFindFile = FindFirstFileW(filename, &FileData);
if (pszFile != filename) {
free((void *)filename);
}
if (hFindFile == INVALID_HANDLE_VALUE) {
return FALSE;
}
FindClose(hFindFile);
find_data_to_file_info(&FileData, info, reparse_tag);
return TRUE;