]> granicus.if.org Git - python/commitdiff
Fix os._DummyDirEntry.is_symlink()
authorVictor Stinner <victor.stinner@gmail.com>
Tue, 29 Mar 2016 09:25:00 +0000 (11:25 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Tue, 29 Mar 2016 09:25:00 +0000 (11:25 +0200)
Issue #25911: Fix os._DummyDirEntry.is_symlink(), don't follow symbolic links:
use os.stat(path, follow_symlinks=False).

Lib/os.py

index c3ce05d33be08ca31c7a96b45dfa91cfcce6784e..90646a055366e464f458985a6e3041901b5bb117 100644 (file)
--- a/Lib/os.py
+++ b/Lib/os.py
@@ -452,22 +452,33 @@ class _DummyDirEntry:
         # Mimick FindFirstFile/FindNextFile: we should get file attributes
         # while iterating on a directory
         self._stat = None
+        self._lstat = None
         try:
-            self.stat()
+            self.stat(follow_symlinks=False)
         except OSError:
             pass
 
-    def stat(self):
-        if self._stat is None:
-            self._stat = stat(self.path)
-        return self._stat
+    def stat(self, *, follow_symlinks=True):
+        if follow_symlinks:
+            if self._stat is None:
+                self._stat = stat(self.path)
+            return self._stat
+        else:
+            if self._lstat is None:
+                self._lstat = stat(self.path, follow_symlinks=False)
+            return self._lstat
 
     def is_dir(self):
+        if self._lstat is not None and not self.is_symlink():
+            # use the cache lstat
+            stat = self.stat(follow_symlinks=False)
+            return st.S_ISDIR(stat.st_mode)
+
         stat = self.stat()
         return st.S_ISDIR(stat.st_mode)
 
     def is_symlink(self):
-        stat = self.stat()
+        stat = self.stat(follow_symlinks=False)
         return st.S_ISLNK(stat.st_mode)
 
 class _dummy_scandir: