]> granicus.if.org Git - python/commitdiff
mktemp() shouldn't rely on os.path.exists(), which can return False if
authorGuido van Rossum <guido@python.org>
Mon, 10 Nov 2003 02:16:36 +0000 (02:16 +0000)
committerGuido van Rossum <guido@python.org>
Mon, 10 Nov 2003 02:16:36 +0000 (02:16 +0000)
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.

Lib/tempfile.py

index 1405a7f742439bba76fa7bdc591b95f64cfc1b71..ef6a1c55d0f6ce4d9978aa17dbf213df07de7db7 100644 (file)
@@ -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")