Fixed #29007 -- Fixed DecimalValidator crash on NaN, SNan, Inf, and Infinity values.

This commit is contained in:
Fabio Bonelli 2017-09-14 15:58:32 +02:00 committed by Tim Graham
parent c886f3dee3
commit f636f0bb86
2 changed files with 11 additions and 0 deletions

View File

@ -391,6 +391,7 @@ class DecimalValidator:
expected, otherwise raise ValidationError. expected, otherwise raise ValidationError.
""" """
messages = { messages = {
'invalid': _('Enter a number.'),
'max_digits': ngettext_lazy( 'max_digits': ngettext_lazy(
'Ensure that there are no more than %(max)s digit in total.', 'Ensure that there are no more than %(max)s digit in total.',
'Ensure that there are no more than %(max)s digits in total.', 'Ensure that there are no more than %(max)s digits in total.',
@ -414,6 +415,8 @@ class DecimalValidator:
def __call__(self, value): def __call__(self, value):
digit_tuple, exponent = value.as_tuple()[1:] digit_tuple, exponent = value.as_tuple()[1:]
if exponent in {'F', 'n', 'N'}:
raise ValidationError(self.messages['invalid'])
if exponent >= 0: if exponent >= 0:
# A positive exponent adds that many trailing zeros. # A positive exponent adds that many trailing zeros.
digits = len(digit_tuple) + exponent digits = len(digit_tuple) + exponent

View File

@ -271,6 +271,14 @@ TEST_DATA = [
(DecimalValidator(max_digits=5, decimal_places=2), Decimal('7304E-3'), ValidationError), (DecimalValidator(max_digits=5, decimal_places=2), Decimal('7304E-3'), ValidationError),
(DecimalValidator(max_digits=5, decimal_places=5), Decimal('70E-5'), None), (DecimalValidator(max_digits=5, decimal_places=5), Decimal('70E-5'), None),
(DecimalValidator(max_digits=5, decimal_places=5), Decimal('70E-6'), ValidationError), (DecimalValidator(max_digits=5, decimal_places=5), Decimal('70E-6'), ValidationError),
# 'Enter a number.' errors
*[
(DecimalValidator(decimal_places=2, max_digits=10), Decimal(value), ValidationError)
for value in (
'NaN', '-NaN', '+NaN', 'sNaN', '-sNaN', '+sNaN',
'Inf', '-Inf', '+Inf', 'Infinity', '-Infinity', '-Infinity',
)
],
(validate_image_file_extension, ContentFile('contents', name='file.jpg'), None), (validate_image_file_extension, ContentFile('contents', name='file.jpg'), None),
(validate_image_file_extension, ContentFile('contents', name='file.png'), None), (validate_image_file_extension, ContentFile('contents', name='file.png'), None),