[issue38822] Inconsistent os.stat behavior for directory with Access Denied
Eryk Sun
report at bugs.python.org
Mon Feb 22 01:49:55 EST 2021
Eryk Sun <eryksun at gmail.com> added the comment:
Here's an implementation of attributes_from_dir() that strips trailing slashes (e.g. "C:/spam///" -> "C:/spam"), which entails copying the const string up to the last character that's not a slash. Rooted paths and drive paths that reference a root directory, such as "/" and "C:////", are special cased to avoid creating an empty path or a drive-relative path (e.g. "C:", which expands to the current working directory on drive C:).
static BOOL
attributes_from_dir(LPCWSTR pszFile, BY_HANDLE_FILE_INFORMATION *info,
ULONG *reparse_tag)
{
BOOL result = TRUE;
HANDLE hFind;
WIN32_FIND_DATAW fileData;
LPWSTR filename = (LPWSTR)pszFile;
size_t len, n;
/* Issue 38822: trailing slashes must be removed. */
/* Get the length without trailing slashes. */
n = len = wcslen(filename);
while (n && (filename[n - 1] == L'\\' || filename[n - 1] == L'/')) {
n--;
}
if (n != len) {
if (n == 0 || (n == 2 && filename[1] == L':')) {
/* A root directory such as \ or C:\ has no parent to query. */
result = FALSE;
goto cleanup;
}
/* Copy the string without trailing slashes. */
filename = malloc((n + 1) * sizeof(WCHAR));
if (!filename || wcsncpy_s(filename, n + 1, pszFile, n)) {
result = FALSE;
goto cleanup;
}
}
hFind = FindFirstFileW(filename, &fileData);
if (hFind == INVALID_HANDLE_VALUE) {
result = FALSE;
goto cleanup;
}
FindClose(hFind);
find_data_to_file_info(&fileData, info, reparse_tag);
cleanup:
if (filename && filename != pszFile) {
free(filename);
}
return result;
}
----------
_______________________________________
Python tracker <report at bugs.python.org>
<https://bugs.python.org/issue38822>
_______________________________________
More information about the Python-bugs-list
mailing list