diff options
author | Guido van Rossum <guido@python.org> | 2003-11-10 02:16:36 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 2003-11-10 02:16:36 (GMT) |
commit | b25615939663823c462c4d441f5c808a9aa38891 (patch) | |
tree | c4bd2a883aff63188be62959228420fa1d957966 | |
parent | f09994e5273e358c5fc764db681bd3dafecc3e2d (diff) | |
download | cpython-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.py | 24 |
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") |