diff options
-rw-r--r-- | qutebrowser/completion/models/listcategory.py | 3 | ||||
-rw-r--r-- | tests/unit/completion/test_listcategory.py | 7 |
2 files changed, 10 insertions, 0 deletions
diff --git a/qutebrowser/completion/models/listcategory.py b/qutebrowser/completion/models/listcategory.py index d4193b6d8..8b52f97d0 100644 --- a/qutebrowser/completion/models/listcategory.py +++ b/qutebrowser/completion/models/listcategory.py @@ -63,6 +63,9 @@ class ListCategory(QSortFilterProxyModel): 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("Pattern too long ({})".format(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 1a54ac814..3a4fa895d 100644 --- a/tests/unit/completion/test_listcategory.py +++ b/tests/unit/completion/test_listcategory.py @@ -20,6 +20,7 @@ """Tests for CompletionFilterModel.""" import pytest +import logging from qutebrowser.completion.models import listcategory @@ -57,3 +58,9 @@ def test_set_pattern(pattern, before, after, after_nosort, model_validator): model_validator.set_model(cat) cat.set_pattern(pattern) model_validator.validate(after_nosort) + + +def test_long_pattern(caplog): + """Validate that a huge pattern doesn't crash (#5973).""" + with caplog.at_level(logging.WARNING): + listcategory.ListCategory('Foo', []).set_pattern('a' * 50000) |