Kaydet (Commit) 2626ea4a authored tarafından Claude Paroz's avatar Claude Paroz

Fixed #14681 -- Do not set mode to None on file-like objects.

gzip.GzipFile does not support files with mode set to None.
üst 4b28ea37
...@@ -12,7 +12,8 @@ class File(FileProxyMixin): ...@@ -12,7 +12,8 @@ class File(FileProxyMixin):
if name is None: if name is None:
name = getattr(file, 'name', None) name = getattr(file, 'name', None)
self.name = name self.name = name
self.mode = getattr(file, 'mode', None) if hasattr(file, 'mode'):
self.mode = file.mode
def __str__(self): def __str__(self):
return smart_str(self.name or '') return smart_str(self.name or '')
......
from __future__ import absolute_import from __future__ import absolute_import
import gzip
import shutil import shutil
import tempfile import tempfile
...@@ -8,11 +9,12 @@ from django.core.files import File ...@@ -8,11 +9,12 @@ from django.core.files import File
from django.core.files.base import ContentFile from django.core.files.base import ContentFile
from django.core.files.uploadedfile import SimpleUploadedFile from django.core.files.uploadedfile import SimpleUploadedFile
from django.test import TestCase from django.test import TestCase
from django.utils import unittest
from .models import Storage, temp_storage, temp_storage_location from .models import Storage, temp_storage, temp_storage_location
class FileTests(TestCase): class FileStorageTests(TestCase):
def tearDown(self): def tearDown(self):
shutil.rmtree(temp_storage_location) shutil.rmtree(temp_storage_location)
...@@ -106,6 +108,8 @@ class FileTests(TestCase): ...@@ -106,6 +108,8 @@ class FileTests(TestCase):
obj3.default.delete() obj3.default.delete()
obj4.random.delete() obj4.random.delete()
class FileTests(unittest.TestCase):
def test_context_manager(self): def test_context_manager(self):
orig_file = tempfile.TemporaryFile() orig_file = tempfile.TemporaryFile()
base_file = File(orig_file) base_file = File(orig_file)
...@@ -114,3 +118,10 @@ class FileTests(TestCase): ...@@ -114,3 +118,10 @@ class FileTests(TestCase):
self.assertFalse(f.closed) self.assertFalse(f.closed)
self.assertTrue(f.closed) self.assertTrue(f.closed)
self.assertTrue(orig_file.closed) self.assertTrue(orig_file.closed)
def test_file_mode(self):
# Should not set mode to None if it is not present.
# See #14681, stdlib gzip module crashes if mode is set to None
file = SimpleUploadedFile("mode_test.txt", "content")
self.assertFalse(hasattr(file, 'mode'))
g = gzip.GzipFile(fileobj=file)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment