diff options
| author | Carlton Gibson <carlton.gibson@noumenal.es> | 2019-02-11 11:08:45 +0100 |
|---|---|---|
| committer | Carlton Gibson <carlton.gibson@noumenal.es> | 2019-02-11 11:14:09 +0100 |
| commit | 1f42f82566c9d2d73aff1c42790d6b1b243f7676 (patch) | |
| tree | 427c70eeb027d84ee99094fffc5f2ca45d27daa4 /django/utils | |
| parent | f6f0f524c3c96830fdaf1b49ed4ca12d54d37c89 (diff) | |
[2.0.x] Fixed CVE-2019-6975 -- Fixed memory exhaustion in utils.numberformat.format().
Thanks Sjoerd Job Postmus for the report and initial patch.
Thanks Michael Manfre, Tim Graham, and Florian Apolloner for review.
Diffstat (limited to 'django/utils')
| -rw-r--r-- | django/utils/numberformat.py | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/django/utils/numberformat.py b/django/utils/numberformat.py index e910be9206..5814c454a4 100644 --- a/django/utils/numberformat.py +++ b/django/utils/numberformat.py @@ -27,7 +27,20 @@ def format(number, decimal_sep, decimal_pos=None, grouping=0, thousand_sep='', # sign sign = '' if isinstance(number, Decimal): - str_number = '{:f}'.format(number) + # Format values with more than 200 digits (an arbitrary cutoff) using + # scientific notation to avoid high memory usage in {:f}'.format(). + _, digits, exponent = number.as_tuple() + if abs(exponent) + len(digits) > 200: + number = '{:e}'.format(number) + coefficient, exponent = number.split('e') + # Format the coefficient. + coefficient = format( + coefficient, decimal_sep, decimal_pos, grouping, + thousand_sep, force_grouping, use_l10n, + ) + return '{}e{}'.format(coefficient, exponent) + else: + str_number = '{:f}'.format(number) else: str_number = str(number) if str_number[0] == '-': |
