diff mbox series

[error-report-web] models: Add index to avoid denial of service

Message ID CADfgfoawtdjc3=oMd6TBY88MdgNBtBD_qijtK5uT1U2gO0_zwA@mail.gmail.com
State New
Headers show
Series [error-report-web] models: Add index to avoid denial of service | expand

Commit Message

Michael Halstead March 10, 2026, 6:34 p.m. UTC
models: Add index to avoid denial of service

Requests for /Errors/SimilarTo/ can cause a denial of service since it
runs unindexed queries.

1000 UTF-8 characters is too long to index properly. In a decade of
production use, our max task length is under 700 characters. Reduce the
field to an indexable size and add the needed index.

Signed-off-by: Michael Halstead <mhalstead@linuxfoundation.org>
---
 ...dfailure_task_buildfailure_idx_task_lev.py | 20 +++++++++++++++++++
 Post/models.py                                |  7 ++++++-
 2 files changed, 26 insertions(+), 1 deletion(-)
 create mode 100644
Post/migrations/0008_alter_buildfailure_task_buildfailure_idx_task_lev.py
diff mbox series

Patch

diff --git a/Post/migrations/0008_alter_buildfailure_task_buildfailure_idx_task_lev.py
b/Post/migrations/0008_alter_buildfailure_task_buildfailure_idx_task_lev.py
new file mode 100644
index 0000000..9bb1f2a
--- /dev/null
+++ b/Post/migrations/0008_alter_buildfailure_task_buildfailure_idx_task_lev.py
@@ -0,0 +1,20 @@ 
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('Post', '0007_alter_build_date_alter_build_error_type_and_more'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='buildfailure',
+            name='TASK',
+            field=models.CharField(max_length=750),
+        ),
+        migrations.AddIndex(
+            model_name='buildfailure',
+            index=models.Index(fields=['TASK', 'LEV_DISTANCE'],
name='idx_task_lev'),
+        ),
+    ]
diff --git a/Post/models.py b/Post/models.py
index bb05d61..f7c0916 100644
--- a/Post/models.py
+++ b/Post/models.py
@@ -57,7 +57,7 @@  class Build(models.Model):
         super(Build, self).save(*args, **kwargs)

 class BuildFailure(models.Model):
-    TASK = models.CharField(max_length=1024)
+    TASK = models.CharField(max_length=750)
     RECIPE= models.CharField(max_length=250)
     RECIPE_VERSION = models.CharField(max_length=200)
     ERROR_DETAILS = models.TextField(max_length=int(settings.MAX_UPLOAD_SIZE))
@@ -74,6 +74,11 @@  class BuildFailure(models.Model):
             default = 'NOT_VISITED'
     )

+    class Meta:
+        indexes = [
+            models.Index(fields=['TASK', 'LEV_DISTANCE'], name='idx_task_lev'),
+        ]
+
     def get_similar_fails(self):
         if self.LEV_DISTANCE is None:
             return BuildFailure.objects.none()