summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBerker Peksag <berker.peksag@gmail.com>2016-09-17 12:51:43 (GMT)
committerBerker Peksag <berker.peksag@gmail.com>2016-09-17 12:51:43 (GMT)
commit6adb2238319d0c1274788e5ad48eb307c4b2b52a (patch)
tree2f57f9d709a7b8404d076e08360ad64fa537c2ed
parent369052bb056ee4a4075241d818a3cb7c83c47e2d (diff)
parent052e4f18c4d1794952b03755ff80aa92b8d19180 (diff)
downloadcpython-6adb2238319d0c1274788e5ad48eb307c4b2b52a.zip
cpython-6adb2238319d0c1274788e5ad48eb307c4b2b52a.tar.gz
cpython-6adb2238319d0c1274788e5ad48eb307c4b2b52a.tar.bz2
Issue #28075: Merge from 3.6
-rw-r--r--Lib/test/test_os.py19
-rw-r--r--Misc/NEWS3
-rw-r--r--Modules/posixmodule.c6
3 files changed, 26 insertions, 2 deletions
diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py
index afeefcb..1746ca4 100644
--- a/Lib/test/test_os.py
+++ b/Lib/test/test_os.py
@@ -460,6 +460,25 @@ class StatAttributeTests(unittest.TestCase):
result.st_file_attributes & 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):
def setUp(self):
diff --git a/Misc/NEWS b/Misc/NEWS
index 777dc4d..76de19f 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -27,6 +27,9 @@ Core and Builtins
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
regular expression now contains a (truncated) regex pattern.
Patch by Tim Graham.
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index 84566d8..ba54249 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -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
get a handle to it. If the former, we need to return an error.
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;
/* Could not get attributes on open file. Fall back to
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 (traverse) {
/* Should traverse, but could not open reparse point handle */
- SetLastError(ERROR_SHARING_VIOLATION);
+ SetLastError(lastError);
return -1;
}
}