From bf3c1c32354499515496fa38215d103cb50dde3b Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Sun, 18 Sep 2016 13:56:29 +0300 Subject: [PATCH] Issue #28075: Fix test_access_denied in Python 3.5 I forgot there two variations of os.stat() in Python 3.5. --- Lib/test/test_os.py | 26 ++++++++++++++------------ Modules/posixmodule.c | 6 ++++-- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 44c65bf64a9..97202109ee3 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -82,6 +82,11 @@ else: # 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 +def create_file(filename, content=b'content'): + with open(filename, "xb", 0) as fp: + fp.write(content) + + # Tests creating TESTFN class FileTests(unittest.TestCase): def setUp(self): @@ -226,15 +231,9 @@ class FileTests(unittest.TestCase): # Test attributes on return values from os.*stat* family. class StatAttributeTests(unittest.TestCase): def setUp(self): - os.mkdir(support.TESTFN) - self.fname = os.path.join(support.TESTFN, "f1") - f = open(self.fname, 'wb') - f.write(b"ABC") - f.close() - - def tearDown(self): - os.unlink(self.fname) - os.rmdir(support.TESTFN) + self.fname = support.TESTFN + self.addCleanup(support.unlink, self.fname) + create_file(self.fname, b"ABC") @unittest.skipUnless(hasattr(os, 'stat'), 'test needs os.stat()') def check_stat_attributes(self, fname): @@ -426,7 +425,11 @@ class StatAttributeTests(unittest.TestCase): 0) # 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.assertEqual( result.st_file_attributes & stat.FILE_ATTRIBUTE_DIRECTORY, @@ -440,8 +443,7 @@ class StatAttributeTests(unittest.TestCase): # supports file ACLs. fname = os.path.join(os.environ['TEMP'], self.fname) self.addCleanup(support.unlink, fname) - with open(fname, 'xb', 0) as fp: - fp.write(b'ABC') + 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 diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index becf65489c1..c993fb6b64e 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -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 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. */ @@ -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 (traverse) { /* Should traverse, but could not open reparse point handle */ - SetLastError(ERROR_SHARING_VIOLATION); + SetLastError(lastError); return -1; } }