mirror of https://github.com/python/cpython
Issue #28075: Merge from 3.6
This commit is contained in:
commit
6adb223831
|
@ -460,6 +460,25 @@ class StatAttributeTests(unittest.TestCase):
|
||||||
result.st_file_attributes & stat.FILE_ATTRIBUTE_DIRECTORY,
|
result.st_file_attributes & stat.FILE_ATTRIBUTE_DIRECTORY,
|
||||||
stat.FILE_ATTRIBUTE_DIRECTORY)
|
stat.FILE_ATTRIBUTE_DIRECTORY)
|
||||||
|
|
||||||
|
@unittest.skipUnless(sys.platform == "win32", "Win32 specific tests")
|
||||||
|
def test_access_denied(self):
|
||||||
|
# Default to FindFirstFile WIN32_FIND_DATA when access is
|
||||||
|
# denied. See issue 28075.
|
||||||
|
# os.environ['TEMP'] should be located on a volume that
|
||||||
|
# supports file ACLs.
|
||||||
|
fname = os.path.join(os.environ['TEMP'], self.fname)
|
||||||
|
self.addCleanup(support.unlink, fname)
|
||||||
|
create_file(fname, b'ABC')
|
||||||
|
# Deny the right to [S]YNCHRONIZE on the file to
|
||||||
|
# force CreateFile to fail with ERROR_ACCESS_DENIED.
|
||||||
|
DETACHED_PROCESS = 8
|
||||||
|
subprocess.check_call(
|
||||||
|
['icacls.exe', fname, '/deny', 'Users:(S)'],
|
||||||
|
creationflags=DETACHED_PROCESS
|
||||||
|
)
|
||||||
|
result = os.stat(fname)
|
||||||
|
self.assertNotEqual(result.st_size, 0)
|
||||||
|
|
||||||
|
|
||||||
class UtimeTests(unittest.TestCase):
|
class UtimeTests(unittest.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
|
|
@ -27,6 +27,9 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #28075: Check for ERROR_ACCESS_DENIED in Windows implementation of
|
||||||
|
os.stat(). Patch by Eryk Sun.
|
||||||
|
|
||||||
- Issue #22493: Warning message emitted by using inline flags in the middle of
|
- Issue #22493: Warning message emitted by using inline flags in the middle of
|
||||||
regular expression now contains a (truncated) regex pattern.
|
regular expression now contains a (truncated) regex pattern.
|
||||||
Patch by Tim Graham.
|
Patch by Tim Graham.
|
||||||
|
|
|
@ -1545,7 +1545,9 @@ win32_xstat_impl(const wchar_t *path, struct _Py_stat_struct *result,
|
||||||
/* Either the target doesn't exist, or we don't have access to
|
/* Either the target doesn't exist, or we don't have access to
|
||||||
get a handle to it. If the former, we need to return an error.
|
get a handle to it. If the former, we need to return an error.
|
||||||
If the latter, we can use attributes_from_dir. */
|
If the latter, we can use attributes_from_dir. */
|
||||||
if (GetLastError() != ERROR_SHARING_VIOLATION)
|
DWORD lastError = GetLastError();
|
||||||
|
if (lastError != ERROR_ACCESS_DENIED &&
|
||||||
|
lastError != ERROR_SHARING_VIOLATION)
|
||||||
return -1;
|
return -1;
|
||||||
/* Could not get attributes on open file. Fall back to
|
/* Could not get attributes on open file. Fall back to
|
||||||
reading the directory. */
|
reading the directory. */
|
||||||
|
@ -1555,7 +1557,7 @@ win32_xstat_impl(const wchar_t *path, struct _Py_stat_struct *result,
|
||||||
if (info.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) {
|
if (info.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) {
|
||||||
if (traverse) {
|
if (traverse) {
|
||||||
/* Should traverse, but could not open reparse point handle */
|
/* Should traverse, but could not open reparse point handle */
|
||||||
SetLastError(ERROR_SHARING_VIOLATION);
|
SetLastError(lastError);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue