mirror of https://github.com/python/cpython
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:
parent
2a3f4899c6
commit
fe63a401a9
|
@ -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`.
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue