summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRyan Roden-Corrent <ryan@rcorre.net>2020-12-28 18:20:26 -0500
committerRyan Roden-Corrent <ryan@rcorre.net>2020-12-28 18:20:26 -0500
commitfaa4d519301e5399dd7ef0fef344d28845ccd1d4 (patch)
tree38695f3b6f1b6b3096f2e1ac663692919002d077
parent4123cda88a7de7c200072fa78cadfd88b3b450e4 (diff)
downloadqutebrowser-faa4d519301e5399dd7ef0fef344d28845ccd1d4.tar.gz
qutebrowser-faa4d519301e5399dd7ef0fef344d28845ccd1d4.zip
Trim long patterns rather than clearing them.
Fixes #5973.
-rw-r--r--qutebrowser/completion/models/listcategory.py6
-rw-r--r--tests/unit/completion/test_listcategory.py7
2 files changed, 8 insertions, 5 deletions
diff --git a/qutebrowser/completion/models/listcategory.py b/qutebrowser/completion/models/listcategory.py
index 307e1ec33..fbe742ddb 100644
--- a/qutebrowser/completion/models/listcategory.py
+++ b/qutebrowser/completion/models/listcategory.py
@@ -59,13 +59,13 @@ class ListCategory(QSortFilterProxyModel):
Args:
val: The value to set.
"""
+ if len(val) > 5000: # avoid crash on huge search terms (#5973)
+ log.completion.warning(f"Trimming {len(val)}-char pattern to 5000")
+ val = val[:5000]
self._pattern = val
val = re.sub(r' +', r' ', val) # See #1919
val = re.escape(val)
val = val.replace(r'\ ', '.*')
- if len(val) > 5000: # avoid crash on huge search terms (#5973)
- log.completion.warning(f"Pattern too long ({len(val)})")
- val = "^$"
rx = QRegularExpression(val, QRegularExpression.CaseInsensitiveOption)
qtutils.ensure_valid(rx)
self.setFilterRegularExpression(rx)
diff --git a/tests/unit/completion/test_listcategory.py b/tests/unit/completion/test_listcategory.py
index 3a4fa895d..b00ab595e 100644
--- a/tests/unit/completion/test_listcategory.py
+++ b/tests/unit/completion/test_listcategory.py
@@ -60,7 +60,10 @@ def test_set_pattern(pattern, before, after, after_nosort, model_validator):
model_validator.validate(after_nosort)
-def test_long_pattern(caplog):
+def test_long_pattern(caplog, model_validator):
"""Validate that a huge pattern doesn't crash (#5973)."""
with caplog.at_level(logging.WARNING):
- listcategory.ListCategory('Foo', []).set_pattern('a' * 50000)
+ cat = listcategory.ListCategory('Foo', [('a' * 5000, '')])
+ model_validator.set_model(cat)
+ cat.set_pattern('a' * 50000)
+ model_validator.validate([('a' * 5000, '')])