summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Forbes <tom@tomforb.es>2019-07-21 21:55:25 +0100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2019-07-23 10:41:50 +0200
commit2d2859bec27c9e3994cff6be56dd5fe0f694a24c (patch)
tree54cc094a8a428e6af4ba359e2bd08d5a790c0364
parent506f800eadea2ab8c9d90f00278b4b03f3a9b771 (diff)
[2.2.x] Fixed #30506 -- Fixed crash of autoreloader when path contains null characters.
Backport of 2ff517ccb6116c1be6338e6bdcf08a313defc5c7 from master.
-rw-r--r--django/utils/autoreload.py14
-rw-r--r--docs/releases/2.2.4.txt3
-rw-r--r--tests/utils_tests/test_autoreload.py11
3 files changed, 23 insertions, 5 deletions
diff --git a/django/utils/autoreload.py b/django/utils/autoreload.py
index 2fdc2f3f83..3153f3f14d 100644
--- a/django/utils/autoreload.py
+++ b/django/utils/autoreload.py
@@ -135,11 +135,15 @@ def iter_modules_and_files(modules, extra_files):
if not filename:
continue
path = pathlib.Path(filename)
- if not path.exists():
- # The module could have been removed, don't fail loudly if this
- # is the case.
- continue
- results.add(path.resolve().absolute())
+ try:
+ if not path.exists():
+ # The module could have been removed, don't fail loudly if this
+ # is the case.
+ continue
+ results.add(path.resolve().absolute())
+ except ValueError as e:
+ # Network filesystems may return null bytes in file paths.
+ logger.debug('"%s" raised when resolving path: "%s"' % (str(e), path))
return frozenset(results)
diff --git a/docs/releases/2.2.4.txt b/docs/releases/2.2.4.txt
index 0ad92f4ab1..af0950d700 100644
--- a/docs/releases/2.2.4.txt
+++ b/docs/releases/2.2.4.txt
@@ -18,3 +18,6 @@ Bugfixes
:class:`~django.contrib.postgres.fields.DateRangeField` or
:class:`~django.contrib.postgres.fields.DateTimeRangeField`, if the right
hand side of an expression is the same type (:ticket:`30621`).
+
+* Fixed a regression in Django 2.2 where auto-reloader crashes if a file path
+ contains nulls characters (``'\x00'``) (:ticket:`30506`).
diff --git a/tests/utils_tests/test_autoreload.py b/tests/utils_tests/test_autoreload.py
index c7308ca53a..59eb32ed70 100644
--- a/tests/utils_tests/test_autoreload.py
+++ b/tests/utils_tests/test_autoreload.py
@@ -138,6 +138,17 @@ class TestIterModulesAndFiles(SimpleTestCase):
fake_main = types.ModuleType('__main__')
self.assertEqual(autoreload.iter_modules_and_files((fake_main,), frozenset()), frozenset())
+ def test_path_with_embedded_null_bytes(self):
+ for path in (
+ 'embedded_null_byte\x00.py',
+ 'di\x00rectory/embedded_null_byte.py',
+ ):
+ with self.subTest(path=path):
+ self.assertEqual(
+ autoreload.iter_modules_and_files((), frozenset([path])),
+ frozenset(),
+ )
+
class TestCommonRoots(SimpleTestCase):
def test_common_roots(self):