]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Issue #28075: Fix test_access_denied in Python 3.5
authorBerker Peksag <berker.peksag@gmail.com>
Sun, 18 Sep 2016 10:56:29 +0000 (13:56 +0300)
committerBerker Peksag <berker.peksag@gmail.com>
Sun, 18 Sep 2016 10:56:29 +0000 (13:56 +0300)
I forgot there two variations of os.stat() in Python 3.5.

Lib/test/test_os.py
Modules/posixmodule.c

index 44c65bf64a9c77f0be48d7ce58b2c76499e6bef6..97202109ee3f4592cfa3814aaeeafbbc438eb936 100644 (file)
@@ -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
index becf65489c164abe599020801fb02818dc440b27..c993fb6b64ef3b8c351cfedcec7ff0ebb3320a62 100644 (file)
@@ -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;
             }
         }