1
0
mirror of https://github.com/django/django.git synced 2025-03-06 15:32:33 +00:00

[5.2.x] Fixed #36191 -- Truncated the overwritten file content in FileSystemStorage.

Backport of 0d1dd6bba0c18b7feb6caa5cbd8df80fbac54afd from main.
This commit is contained in:
Gaël Utard 2025-02-15 15:55:33 +01:00 committed by Sarah Boyce
parent c55a808198
commit ae391ca368
4 changed files with 19 additions and 2 deletions

View File

@ -369,6 +369,7 @@ answer newbie questions, and generally made Django that much better:
Fraser Nevett <mail@nevett.org>
Gabriel Grant <g@briel.ca>
Gabriel Hurley <gabriel@strikeawe.com>
Gaël Utard
gandalf@owca.info
Garry Lawrence
Garry Polley <garrympolley@gmail.com>

View File

@ -129,11 +129,11 @@ class FileSystemStorage(Storage, StorageSettingsMixin):
)
# RemovedInDjango60Warning: when the deprecation ends, replace with:
# if self._allow_overwrite:
# open_flags = open_flags & ~os.O_EXCL
# open_flags = open_flags & ~os.O_EXCL | os.O_TRUNC
if self.OS_OPEN_FLAGS != open_flags:
open_flags = self.OS_OPEN_FLAGS
elif self._allow_overwrite:
open_flags = open_flags & ~os.O_EXCL
open_flags = open_flags & ~os.O_EXCL | os.O_TRUNC
fd = os.open(full_path, open_flags, 0o666)
_file = None
try:

View File

@ -12,3 +12,7 @@ Bugfixes
* Fixed a bug in Django 5.1 where the ``{% querystring %}`` template tag
returned an empty string rather than ``"?"`` when all parameters had been
removed from the query string (:ticket:`36182`).
* Fixed a bug in Django 5.1 where ``FileSystemStorage``, with
``allow_overwrite`` set to ``True``, did not truncate the overwritten file
content (:ticket:`36191`).

View File

@ -704,6 +704,18 @@ class OverwritingStorageTests(FileStorageTests):
finally:
self.storage.delete(name)
def test_save_overwrite_behavior_truncate(self):
name = "test.file"
original_content = b"content extra extra extra"
new_smaller_content = b"content"
self.storage.save(name, ContentFile(original_content))
try:
self.storage.save(name, ContentFile(new_smaller_content))
with self.storage.open(name) as fp:
self.assertEqual(fp.read(), new_smaller_content)
finally:
self.storage.delete(name)
def test_save_overwrite_behavior_temp_file(self):
"""Saving to same file name twice overwrites the first file."""
name = "test.file"