Skip to content

Commit

Permalink
bpo-38822: Fixed os.stat failing on inaccessible directories. (GH-25527)
Browse files Browse the repository at this point in the history
It would just fail if the path was inaccessible and had a trailing slash. It should fall back to the parent directory's metadata.
(cherry picked from commit fe63a40)

Co-authored-by: Steve Dower <steve.dower@python.org>
  • Loading branch information
miss-islington and zooba committed Apr 22, 2021
1 parent 87a392d commit 8e7cebb
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 2 deletions.
@@ -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`.
23 changes: 21 additions & 2 deletions Modules/posixmodule.c
Expand Up @@ -1799,9 +1799,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;
Expand Down

0 comments on commit 8e7cebb

Please sign in to comment.