From 572ea07e84b38ea8de0551f4b4eda685d91d09d2
From: Adam Johnson <me@adamj.eu>
Date: Mon Jan 22 13:21:13 2024 +0000
Subject: [PATCH] Fixed CVE-2024-24680 -- Mitigated potential DoS in intcomma
 template filter

Thanks Seokchan Yoon for the report.

Co-authored-by: Mariusz Felisiak <felisiak.mariusz@gmail.com>
Co-authored-by: Natalia <124304+nessita@users.noreply.github.com>
Co-authored-by: Shai Berger <shai@platonix.com>

CVE: CVE-2024-24680

Upstream-Status: Backport [https://github.com/django/django/commit/572ea07e84b38ea8de0551f4b4eda685d91d09d2]

Signed-off-by: Rahul Janani Pandi <RahulJanani.Pandi@windriver.com>
---
 django/contrib/humanize/templatetags/humanize.py | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/django/contrib/humanize/templatetags/humanize.py b/django/contrib/humanize/templatetags/humanize.py
index 194c7e8..ee22a45 100644
--- a/django/contrib/humanize/templatetags/humanize.py
+++ b/django/contrib/humanize/templatetags/humanize.py
@@ -71,13 +71,14 @@ def intcomma(value, use_l10n=True):
             return intcomma(value, False)
         else:
             return number_format(value, force_grouping=True)
-    orig = str(value)
-    new = re.sub(r"^(-?\d+)(\d{3})", r'\g<1>,\g<2>', orig)
-    if orig == new:
-        return new
-    else:
-        return intcomma(new, use_l10n)

+    result = str(value)
+    match = re.match(r"-?\d+", result)
+    if match:
+        prefix = match[0]
+        prefix_with_commas = re.sub(r"\d{3}", r"\g<0>,", prefix[::-1])[::-1]
+        result = prefix_with_commas + result[len(prefix) :]
+    return result

 # A tuple of standard large number to their converters
 intword_converters = (
--
2.40.0
