diff --git a/django/core/cache/backends/filebased.py b/django/core/cache/backends/filebased.py index 09a68b34bb..deceffaa0d 100644 --- a/django/core/cache/backends/filebased.py +++ b/django/core/cache/backends/filebased.py @@ -116,7 +116,10 @@ class FileBasedCache(BaseCache): """ Take an open cache file `f` and delete it if it's expired. """ - exp = pickle.load(f) + try: + exp = pickle.load(f) + except EOFError: + exp = 0 # An empty file is considered expired. if exp is not None and exp < time.time(): f.close() # On Windows a file has to be closed before deleting self._delete(f.name) diff --git a/tests/cache/tests.py b/tests/cache/tests.py index eb5865f08d..cef000cb02 100644 --- a/tests/cache/tests.py +++ b/tests/cache/tests.py @@ -1366,6 +1366,13 @@ class FileBasedCacheTests(BaseCacheTests, TestCase): with self.assertRaises(IOError): cache.get('foo') + def test_empty_cache_file_considered_expired(self): + cache_file = cache._key_to_file('foo') + with open(cache_file, 'wb') as fh: + fh.write(b'') + with open(cache_file, 'rb') as fh: + self.assertIs(cache._is_expired(fh), True) + @override_settings(CACHES={ 'default': {