[Python-checkins] cpython: Fix os._DummyDirEntry.is_symlink()

victor.stinner python-checkins at python.org
Tue Mar 29 05:29:22 EDT 2016


https://hg.python.org/cpython/rev/2b25fa7e3b7a
changeset: 100784:2b25fa7e3b7a
user: Victor Stinner <victor.stinner at gmail.com>
date: Tue Mar 29 11:25:00 2016 +0200
summary:
 Fix os._DummyDirEntry.is_symlink()
Issue #25911: Fix os._DummyDirEntry.is_symlink(), don't follow symbolic links:
use os.stat(path, follow_symlinks=False).
files:
 Lib/os.py | 23 +++++++++++++++++------
 1 files changed, 17 insertions(+), 6 deletions(-)
diff --git a/Lib/os.py b/Lib/os.py
--- a/Lib/os.py
+++ b/Lib/os.py
@@ -452,22 +452,33 @@
 # 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:
-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /