Fixed #30506 -- Fixed crash of autoreloader when path contains null characters.

This commit is contained in:
Tom Forbes 2019-07-21 21:55:25 +01:00 committed by Mariusz Felisiak
parent 60dc957a82
commit 2ff517ccb6
3 changed files with 18 additions and 0 deletions

View File

@ -143,6 +143,10 @@ def iter_modules_and_files(modules, extra_files):
# The module could have been removed, don't fail loudly if this # The module could have been removed, don't fail loudly if this
# is the case. # is the case.
continue continue
except ValueError as e:
# Network filesystems may return null bytes in file paths.
logger.debug('"%s" raised when resolving path: "%s"' % (str(e), path))
continue
results.add(resolved_path) results.add(resolved_path)
return frozenset(results) return frozenset(results)

View File

@ -18,3 +18,6 @@ Bugfixes
:class:`~django.contrib.postgres.fields.DateRangeField` or :class:`~django.contrib.postgres.fields.DateRangeField` or
:class:`~django.contrib.postgres.fields.DateTimeRangeField`, if the right :class:`~django.contrib.postgres.fields.DateTimeRangeField`, if the right
hand side of an expression is the same type (:ticket:`30621`). 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`).

View File

@ -140,6 +140,17 @@ class TestIterModulesAndFiles(SimpleTestCase):
fake_main = types.ModuleType('__main__') fake_main = types.ModuleType('__main__')
self.assertEqual(autoreload.iter_modules_and_files((fake_main,), frozenset()), frozenset()) 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): class TestCommonRoots(SimpleTestCase):
def test_common_roots(self): def test_common_roots(self):