Commit ca776a02 authored by Berker Peksag's avatar Berker Peksag

Issue #28075: Fix test_access_denied in Python 3.5

I forgot there two variations of os.stat() in Python 3.5.
parent 50b7819a
...@@ -82,6 +82,11 @@ else: ...@@ -82,6 +82,11 @@ else:
# Issue #14110: Some tests fail on FreeBSD if the user is in the wheel group. # Issue #14110: Some tests fail on FreeBSD if the user is in the wheel group.
HAVE_WHEEL_GROUP = sys.platform.startswith('freebsd') and os.getgid() == 0 HAVE_WHEEL_GROUP = sys.platform.startswith('freebsd') and os.getgid() == 0
def create_file(filename, content=b'content'):
with open(filename, "xb", 0) as fp:
fp.write(content)
# Tests creating TESTFN # Tests creating TESTFN
class FileTests(unittest.TestCase): class FileTests(unittest.TestCase):
def setUp(self): def setUp(self):
...@@ -226,15 +231,9 @@ class FileTests(unittest.TestCase): ...@@ -226,15 +231,9 @@ class FileTests(unittest.TestCase):
# Test attributes on return values from os.*stat* family. # Test attributes on return values from os.*stat* family.
class StatAttributeTests(unittest.TestCase): class StatAttributeTests(unittest.TestCase):
def setUp(self): def setUp(self):
os.mkdir(support.TESTFN) self.fname = support.TESTFN
self.fname = os.path.join(support.TESTFN, "f1") self.addCleanup(support.unlink, self.fname)
f = open(self.fname, 'wb') create_file(self.fname, b"ABC")
f.write(b"ABC")
f.close()
def tearDown(self):
os.unlink(self.fname)
os.rmdir(support.TESTFN)
@unittest.skipUnless(hasattr(os, 'stat'), 'test needs os.stat()') @unittest.skipUnless(hasattr(os, 'stat'), 'test needs os.stat()')
def check_stat_attributes(self, fname): def check_stat_attributes(self, fname):
...@@ -426,7 +425,11 @@ class StatAttributeTests(unittest.TestCase): ...@@ -426,7 +425,11 @@ class StatAttributeTests(unittest.TestCase):
0) 0)
# test directory st_file_attributes (FILE_ATTRIBUTE_DIRECTORY set) # test directory st_file_attributes (FILE_ATTRIBUTE_DIRECTORY set)
result = os.stat(support.TESTFN) dirname = support.TESTFN + "dir"
os.mkdir(dirname)
self.addCleanup(os.rmdir, dirname)
result = os.stat(dirname)
self.check_file_attributes(result) self.check_file_attributes(result)
self.assertEqual( self.assertEqual(
result.st_file_attributes & stat.FILE_ATTRIBUTE_DIRECTORY, result.st_file_attributes & stat.FILE_ATTRIBUTE_DIRECTORY,
...@@ -440,8 +443,7 @@ class StatAttributeTests(unittest.TestCase): ...@@ -440,8 +443,7 @@ class StatAttributeTests(unittest.TestCase):
# supports file ACLs. # supports file ACLs.
fname = os.path.join(os.environ['TEMP'], self.fname) fname = os.path.join(os.environ['TEMP'], self.fname)
self.addCleanup(support.unlink, fname) self.addCleanup(support.unlink, fname)
with open(fname, 'xb', 0) as fp: create_file(fname, b'ABC')
fp.write(b'ABC')
# Deny the right to [S]YNCHRONIZE on the file to # Deny the right to [S]YNCHRONIZE on the file to
# force CreateFile to fail with ERROR_ACCESS_DENIED. # force CreateFile to fail with ERROR_ACCESS_DENIED.
DETACHED_PROCESS = 8 DETACHED_PROCESS = 8
......
...@@ -1607,7 +1607,9 @@ win32_xstat_impl_w(const wchar_t *path, struct _Py_stat_struct *result, ...@@ -1607,7 +1607,9 @@ win32_xstat_impl_w(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. */
...@@ -1617,7 +1619,7 @@ win32_xstat_impl_w(const wchar_t *path, struct _Py_stat_struct *result, ...@@ -1617,7 +1619,7 @@ win32_xstat_impl_w(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;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment