--- a/src/qtgui/guiutils.cpp
+++ b/src/qtgui/guiutils.cpp
@@ -87,26 +87,40 @@
SETTING_RW(prefs.ssearchTyp, "/Recoll/prefs/simpleSearchTyp", Int, 3);
SETTING_RW(prefs.startWithAdvSearchOpen,
"/Recoll/prefs/startWithAdvSearchOpen", Bool, false);
- SETTING_RW(prefs.previewHtml,
- "/Recoll/prefs/previewHtml", Bool, true);
+ SETTING_RW(prefs.previewHtml, "/Recoll/prefs/previewHtml", Bool, true);
QString advSearchClauses;
+ const int maxclauselistsize = 20;
+ if (writing) {
+ // Limit clause list size to non-absurd size
+ if (prefs.advSearchClauses.size() > maxclauselistsize) {
+ prefs.advSearchClauses.resize(maxclauselistsize);
+ }
+ for (auto clause : prefs.advSearchClauses) {
+ char buf[20];
+ sprintf(buf, "%d ", clause);
+ advSearchClauses += QString::fromUtf8(buf);
+ }
+ }
QString ascdflt;
- if (writing) {
- for (vector<int>::iterator it = prefs.advSearchClauses.begin();
- it != prefs.advSearchClauses.end(); it++) {
- char buf[20];
- sprintf(buf, "%d ", *it);
- advSearchClauses += QString::fromUtf8(buf);
- }
- }
SETTING_RW(advSearchClauses, "/Recoll/prefs/adv/clauseList", String, ascdflt);
if (!writing) {
- list<string> clauses;
- stringToStrings((const char *)advSearchClauses.toUtf8(), clauses);
- for (list<string>::iterator it = clauses.begin();
- it != clauses.end(); it++) {
- prefs.advSearchClauses.push_back(atoi(it->c_str()));
+ vector<string> clauses;
+ stringToStrings(qs2utf8s(advSearchClauses), clauses);
+ // There was a long-lurking bug where the clause list was
+ // growing to absurd sizes. The prefs.advSearchClauses clear()
+ // call was missing (ok with the now false initial assumption
+ // that the prefs were read once per session), which was
+ // causing a doubling of the size each time the prefs were
+ // read. Should be fixed, but in any case, limit the clause
+ // list to a non-absurd size.
+ if (clauses.size() > maxclauselistsize) {
+ clauses.resize(maxclauselistsize);
+ }
+ prefs.advSearchClauses.clear();
+ prefs.advSearchClauses.reserve(clauses.size());
+ for (auto clause : clauses) {
+ prefs.advSearchClauses.push_back(atoi(clause.c_str()));
}
}