summaryrefslogtreecommitdiff
path: root/django/template
diff options
context:
space:
mode:
authorAymeric Augustin <aymeric.augustin@m4x.org>2014-11-11 18:59:49 +0100
committerAymeric Augustin <aymeric.augustin@m4x.org>2014-11-11 19:05:14 +0100
commitb8ba73cd0cb6a3dbdaeb3df65936970956829de3 (patch)
tree6a21c861d3461a6af30358c7b0437c662c33cc5c /django/template
parent40ba6f21bb5a728987da9a7055c74fa3c65da4db (diff)
Raised SuspiciousFileOperation in safe_join.
Added a test for the condition safe_join is designed to prevent. Previously, a generic ValueError was raised. It was impossible to tell an intentional exception raised to implement safe_join's contract from an unintentional exception caused by incorrect inputs or unexpected conditions. That resulted in bizarre exception catching patterns, which this patch removes. Since safe_join is a private API and since the change is unlikely to create security issues for users who use it anyway -- at worst, an uncaught SuspiciousFileOperation exception will bubble up -- it isn't documented.
Diffstat (limited to 'django/template')
-rw-r--r--django/template/loaders/app_directories.py9
-rw-r--r--django/template/loaders/filesystem.py11
2 files changed, 8 insertions, 12 deletions
diff --git a/django/template/loaders/app_directories.py b/django/template/loaders/app_directories.py
index b66adaed08..cab1edf8cc 100644
--- a/django/template/loaders/app_directories.py
+++ b/django/template/loaders/app_directories.py
@@ -8,6 +8,7 @@ import sys
from django.apps import apps
from django.conf import settings
+from django.core.exceptions import SuspiciousFileOperation
from django.template.base import TemplateDoesNotExist
from django.template.loader import BaseLoader
from django.utils._os import safe_join
@@ -47,11 +48,9 @@ class Loader(BaseLoader):
for template_dir in template_dirs:
try:
yield safe_join(template_dir, template_name)
- except UnicodeDecodeError:
- # The template dir name was a bytestring that wasn't valid UTF-8.
- raise
- except ValueError:
- # The joined path was located outside of template_dir.
+ except SuspiciousFileOperation:
+ # The joined path was located outside of this template_dir
+ # (it might be inside another one, so this isn't fatal).
pass
def load_template_source(self, template_name, template_dirs=None):
diff --git a/django/template/loaders/filesystem.py b/django/template/loaders/filesystem.py
index 52e41ef0b9..dc7de84abf 100644
--- a/django/template/loaders/filesystem.py
+++ b/django/template/loaders/filesystem.py
@@ -3,6 +3,7 @@ Wrapper for loading templates from the filesystem.
"""
from django.conf import settings
+from django.core.exceptions import SuspiciousFileOperation
from django.template.base import TemplateDoesNotExist
from django.template.loader import BaseLoader
from django.utils._os import safe_join
@@ -22,13 +23,9 @@ class Loader(BaseLoader):
for template_dir in template_dirs:
try:
yield safe_join(template_dir, template_name)
- except UnicodeDecodeError:
- # The template dir name was a bytestring that wasn't valid UTF-8.
- raise
- except ValueError:
- # The joined path was located outside of this particular
- # template_dir (it might be inside another one, so this isn't
- # fatal).
+ except SuspiciousFileOperation:
+ # The joined path was located outside of this template_dir
+ # (it might be inside another one, so this isn't fatal).
pass
def load_template_source(self, template_name, template_dirs=None):