mirror of
https://github.com/django/django.git
synced 2025-10-29 16:46:11 +00:00
[1.6.x] Fixed #23157 -- Removed O(n) algorithm when uploading duplicate file names.
This is a security fix. Disclosure following shortly.
This commit is contained in:
@@ -1,12 +1,12 @@
|
||||
import os
|
||||
import errno
|
||||
import itertools
|
||||
from datetime import datetime
|
||||
|
||||
from django.conf import settings
|
||||
from django.core.exceptions import SuspiciousFileOperation
|
||||
from django.core.files import locks, File
|
||||
from django.core.files.move import file_move_safe
|
||||
from django.utils.crypto import get_random_string
|
||||
from django.utils.encoding import force_text, filepath_to_uri
|
||||
from django.utils.functional import LazyObject
|
||||
from django.utils.module_loading import import_by_path
|
||||
@@ -67,13 +67,12 @@ class Storage(object):
|
||||
"""
|
||||
dir_name, file_name = os.path.split(name)
|
||||
file_root, file_ext = os.path.splitext(file_name)
|
||||
# If the filename already exists, add an underscore and a number (before
|
||||
# the file extension, if one exists) to the filename until the generated
|
||||
# filename doesn't exist.
|
||||
count = itertools.count(1)
|
||||
# If the filename already exists, add an underscore and a random 7
|
||||
# character alphanumeric string (before the file extension, if one
|
||||
# exists) to the filename until the generated filename doesn't exist.
|
||||
while self.exists(name):
|
||||
# file_ext includes the dot.
|
||||
name = os.path.join(dir_name, "%s_%s%s" % (file_root, next(count), file_ext))
|
||||
name = os.path.join(dir_name, "%s_%s%s" % (file_root, get_random_string(7), file_ext))
|
||||
|
||||
return name
|
||||
|
||||
|
||||
Reference in New Issue
Block a user