Browse files

Fixed #20486 -- Ensure that file_move_safe raises an error if the des…

…tination already exists.

Thanks to kux for the report, and Russ Webber for the patch.
  • Loading branch information...
freakboy3742 committed Jun 20, 2013
1 parent 3671e7e commit 18e79f1425fa87f2f38df25c65203ec4d311f499
Showing with 19 additions and 0 deletions.
  1. +1 −0 AUTHORS
  2. +4 −0 django/core/files/
  3. +14 −0 tests/files/
@@ -608,6 +608,7 @@ answer newbie questions, and generally made Django that much better:
Filip Wasilewski <>
Dan Watson <>
Joel Watts <>
Russ Webber
Lakin Wecker <>
Chris Wesseling <>
Benjamin Wohlwend <>
@@ -51,6 +51,10 @@ def file_move_safe(old_file_name, new_file_name, chunk_size = 1024*64, allow_ove
# If the destination file exists and allow_overwrite is False then raise an IOError
if not allow_overwrite and os.access(new_file_name, os.F_OK):
raise IOError("Destination file %s exists and allow_overwrite is False" % new_file_name)
os.rename(old_file_name, new_file_name)
except OSError:
@@ -1,11 +1,13 @@
from __future__ import absolute_import
import os
import gzip
import shutil
import tempfile
from django.core.cache import cache
from django.core.files import File
from django.core.files.move import file_move_safe
from django.core.files.base import ContentFile
from django.core.files.uploadedfile import SimpleUploadedFile
from django.test import TestCase
@@ -146,3 +148,15 @@ def test_file_mode(self):
file = SimpleUploadedFile("mode_test.txt", b"content")
self.assertFalse(hasattr(file, 'mode'))
g = gzip.GzipFile(fileobj=file)
class FileMoveSafeTests(unittest.TestCase):
def test_file_move_overwrite(self):
handle_a, self.file_a = tempfile.mkstemp(dir=os.environ['DJANGO_TEST_TEMP_DIR'])
handle_b, self.file_b = tempfile.mkstemp(dir=os.environ['DJANGO_TEST_TEMP_DIR'])
# file_move_safe should raise an IOError exception if destination file exists and allow_overwrite is False
self.assertRaises(IOError, lambda: file_move_safe(self.file_a, self.file_b, allow_overwrite=False))
# should allow it and continue on if allow_overwrite is True
self.assertIsNone(file_move_safe(self.file_a, self.file_b, allow_overwrite=True))

0 comments on commit 18e79f1

Please sign in to comment.