Commit 359be1c8 authored by Jon Dufresne's avatar Jon Dufresne Committed by Tim Graham
Browse files

Fixed #26691 -- Removed checking for a file's existence before deleting.

File operations always raise a ENOENT error when a file doesn't exist.
Checking the file exists before the operation adds a race condition
condition where the file could be removed between operations. As the
operation already raises an error on a missing file, avoid this race and
avoid checking the file exists twice. Instead only check a file exists
by catching the ENOENT error.
parent e3877c53
Loading
Loading
Loading
Loading
+7 −8
Original line number Diff line number Diff line
@@ -35,14 +35,13 @@ class FileBasedCache(BaseCache):

    def get(self, key, default=None, version=None):
        fname = self._key_to_file(key, version)
        if os.path.exists(fname):
        try:
            with io.open(fname, 'rb') as f:
                if not self._is_expired(f):
                    return pickle.loads(zlib.decompress(f.read()))
        except IOError as e:
            if e.errno == errno.ENOENT:
                    pass  # Cache file was removed after the exists check
                pass  # Cache file doesn't exist.
        return default

    def set(self, key, value, timeout=DEFAULT_TIMEOUT, version=None):
+7 −9
Original line number Diff line number Diff line
@@ -380,10 +380,8 @@ class FileSystemStorage(Storage):
        assert name, "The name argument is not allowed to be empty."
        name = self.path(name)
        # If the file exists, delete it from the filesystem.
        # Note that there is a race between os.path.exists and os.remove:
        # if os.remove fails with ENOENT, the file was removed
        # concurrently, and we can continue normally.
        if os.path.exists(name):
        # If os.remove() fails with ENOENT, the file may have been removed
        # concurrently, and it's safe to continue normally.
        try:
            os.remove(name)
        except OSError as e:
+5 −6
Original line number Diff line number Diff line
@@ -48,7 +48,6 @@ class PathNotImplementedStorage(storage.Storage):

    def delete(self, name):
        name = self._path(name)
        if os.path.exists(name):
        try:
            os.remove(name)
        except OSError as e: