summaryrefslogtreecommitdiff
path: root/src/spellsuggest.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2022-01-29 10:51:59 +0000
committerBram Moolenaar <Bram@vim.org>2022-01-29 10:51:59 +0000
commit06f15416bb8d5636200a10776f1752c4d6e49f31 (patch)
tree65ebdd6be53eb416d3550989d9fc5004e4fe7fb6 /src/spellsuggest.c
parente96eea7b6a56bc7c12e062e90b2e816ff61e705c (diff)
downloadvim-git-06f15416bb8d5636200a10776f1752c4d6e49f31.tar.gz
patch 8.2.4247: stack corruption when looking for spell suggestionsv8.2.4247
Problem: Stack corruption when looking for spell suggestions. Solution: Prevent the depth increased too much. Add a five second time limit to finding suggestions.
Diffstat (limited to 'src/spellsuggest.c')
-rw-r--r--src/spellsuggest.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/spellsuggest.c b/src/spellsuggest.c
index b2b402919..e54b6fdc8 100644
--- a/src/spellsuggest.c
+++ b/src/spellsuggest.c
@@ -1205,7 +1205,7 @@ suggest_try_change(suginfo_T *su)
// Check the maximum score, if we go over it we won't try this change.
#define TRY_DEEPER(su, stack, depth, add) \
- (stack[depth].ts_score + (add) < su->su_maxscore)
+ (depth < MAXWLEN && stack[depth].ts_score + (add) < su->su_maxscore)
/*
* Try finding suggestions by adding/removing/swapping letters.
@@ -1277,6 +1277,9 @@ suggest_trie_walk(
char_u changename[MAXWLEN][80];
#endif
int breakcheckcount = 1000;
+#ifdef FEAT_RELTIME
+ proftime_T time_limit;
+#endif
int compound_ok;
// Go through the whole case-fold tree, try changes at each node.
@@ -1321,6 +1324,11 @@ suggest_trie_walk(
sp->ts_state = STATE_START;
}
}
+#ifdef FEAT_RELTIME
+ // The loop may take an indefinite amount of time. Break out after five
+ // sectonds. TODO: add an option for the time limit.
+ profile_setlimit(5000, &time_limit);
+#endif
// Loop to find all suggestions. At each round we either:
// - For the current state try one operation, advance "ts_curi",
@@ -1355,7 +1363,8 @@ suggest_trie_walk(
// At end of a prefix or at start of prefixtree: check for
// following word.
- if (byts[arridx] == 0 || n == (int)STATE_NOPREFIX)
+ if (depth < MAXWLEN
+ && (byts[arridx] == 0 || n == (int)STATE_NOPREFIX))
{
// Set su->su_badflags to the caps type at this position.
// Use the caps type until here for the prefix itself.
@@ -2649,6 +2658,10 @@ suggest_trie_walk(
{
ui_breakcheck();
breakcheckcount = 1000;
+#ifdef FEAT_RELTIME
+ if (profile_passed_limit(&time_limit))
+ got_int = TRUE;
+#endif
}
}
}