summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRyan Roden-Corrent <ryan@rcorre.net>2020-12-28 12:57:55 -0500
committerRyan Roden-Corrent <ryan@rcorre.net>2020-12-28 12:57:55 -0500
commitbf57c0122cdf6da7a509be8bca12d4350c50ac8a (patch)
treee20e17432ec37b271d2f728fef35c16c834bf5d2
parent8e7f24bc0c6cdb333fef1a4a72d659aaeb7bbf09 (diff)
downloadqutebrowser-bf57c0122cdf6da7a509be8bca12d4350c50ac8a.tar.gz
qutebrowser-bf57c0122cdf6da7a509be8bca12d4350c50ac8a.zip
Don't crash on long search patterns.
Entering an overly long search term into the completion causes a crash: ``` PyQt5.QtCore.QRegularExpression.PatternOptions(1)) is not valid: regular expression is too large ``` This can happen, for example, when pressing `go` at the qutebrowser error page. I'm unclear on exactly what the limit is, but 50k characters seems to trip it on my machine. Still, it seems like any pattern larger than a certain amount is likely an error, so I settled on limiting it to 5k. Fixes #5973
-rw-r--r--qutebrowser/completion/models/listcategory.py3
-rw-r--r--tests/unit/completion/test_listcategory.py7
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)