summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2003-11-10 02:16:36 (GMT)
committerGuido van Rossum <guido@python.org>2003-11-10 02:16:36 (GMT)
commitb25615939663823c462c4d441f5c808a9aa38891 (patch)
treec4bd2a883aff63188be62959228420fa1d957966
parentf09994e5273e358c5fc764db681bd3dafecc3e2d (diff)
downloadcpython-b25615939663823c462c4d441f5c808a9aa38891.zip
cpython-b25615939663823c462c4d441f5c808a9aa38891.tar.gz
cpython-b25615939663823c462c4d441f5c808a9aa38891.tar.bz2
mktemp() shouldn't rely on os.path.exists(), which can return False if
the file is a symlink. Instead, use os.lstat directly, if it exists; fall back on os.stat or the built-in open. Thanks to Iustin Pop.
-rw-r--r--Lib/tempfile.py24
1 files changed, 23 insertions, 1 deletions
diff --git a/Lib/tempfile.py b/Lib/tempfile.py
index 1405a7f..ef6a1c5 100644
--- a/Lib/tempfile.py
+++ b/Lib/tempfile.py
@@ -84,6 +84,28 @@ tempdir = None
_once_lock = _allocate_lock()
+if hasattr(_os, "lstat"):
+ _stat = _os.lstat
+elif hasattr(_os, "stat"):
+ _stat = _os.stat
+else:
+ # Fallback. All we need is something that raises os.error if the
+ # file doesn't exist.
+ def _stat(fn):
+ try:
+ f = open(fn)
+ except IOError:
+ raise _os.error
+ f.close()
+
+def _exists(fn):
+ try:
+ _stat(fn)
+ except _os.error:
+ return False
+ else:
+ return True
+
class _RandomNameSequence:
"""An instance of _RandomNameSequence generates an endless
sequence of unpredictable strings which can safely be incorporated
@@ -339,7 +361,7 @@ def mktemp(suffix="", prefix=template, dir=None):
for seq in xrange(TMP_MAX):
name = names.next()
file = _os.path.join(dir, prefix + name + suffix)
- if not _os.path.exists(file):
+ if not _exists(file):
return file
raise IOError, (_errno.EEXIST, "No usable temporary filename found")