Eryk Sun <eryk...@gmail.com> added the comment:

In attributes_from_dir() in Modules/posixmodule.c, a trailing backslash or 
slash should be stripped from the lpFileName parameter of FindFirstFileW. 
Otherwise the call opens the directory via NtOpenFile, instead of opening its 
parent directory. Even if opening the directory is successful, which we don't 
expect in this case, FindFirstFileW forcibly fails the call with 
ERROR_FILE_NOT_FOUND (2) because it expects a filename filter (e.g. "*") for 
the internal NtQueryDirectoryFile[Ex] system call.

Care needs to be taken to not strip the trailing slash of the root directory of 
a DOS drive because that creates a drive-relative path (e.g. "C:"). It is 
expected that FindFirstFileW will fail for the root of a DOS drive or UNC 
share, since there's no parent directory to open.

----

"System Volume Information" explicitly grants access only to the SYSTEM 
account. Implicitly we have read-attributes access to this directory because we 
have read-data (i.e. list-directory) access to the root directory. Great, but 
even for 0 desired access, CreateFileW requests both read-attributes and 
synchronize access, even for overlapped I/O (i.e. kernel File objects created 
by CreateFileW can always be waited on). So even an elevated administrator 
normally can't open this directory to query information. However, backup and 
restore privileges are in effect when an open requests backup semantics, which 
we already do. We could extend os.stat to temporarily enable SeBackupPrivilege 
if the caller has it. 

It's also possible to open the directory with a native NtOpenFile or 
NtCreateFile system call, without the FILE_SYNCHRONOUS_IO_NONALERT option and 
without requesting SYNCHRONIZE access -- i.e. the File object will be 
asynchronous and not waitable.

----------
nosy: +eryksun

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue38822>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to