diff options
author | Reuben Thomas <rrt@sc3d.org> | 2017-04-12 15:28:18 +0100 |
---|---|---|
committer | Reuben Thomas <rrt@sc3d.org> | 2017-04-14 23:56:25 +0100 |
commit | 350500d896e1c3b9c2310ca95b0e96df40055a26 (patch) | |
tree | 8b3bde7a07ba0952befa7c4f56d2cac6834756ba /src/pwl.c | |
parent | 852d26d67531b1d8e4aa5b72da5a0eb426cbb91b (diff) | |
download | enchant-350500d896e1c3b9c2310ca95b0e96df40055a26.tar.gz |
Fix buffer overrun in PWL trie-matching
Thanks, Valgrind!
Diffstat (limited to 'src/pwl.c')
-rw-r--r-- | src/pwl.c | 16 |
1 files changed, 9 insertions, 7 deletions
@@ -1062,7 +1062,7 @@ static void enchant_trie_find_matches_cb(void* keyV,void* subtrieV,void* matcher enchant_trie_find_matches(subtrie2,matcher); enchant_trie_matcher_poppath(matcher,strlen(key2)); enchant_trie_matcher_poppath(matcher,strlen(key)); -} + } } g_free(key2); @@ -1071,11 +1071,11 @@ static void enchant_trie_find_matches_cb(void* keyV,void* subtrieV,void* matcher } static EnchantTrieMatcher* enchant_trie_matcher_init(const char* const word, - size_t len, - int maxerrs, - EnchantTrieMatcherMode mode, - void(*cbfunc)(char*,EnchantTrieMatcher*), - void* cbdata) + size_t len, + int maxerrs, + EnchantTrieMatcherMode mode, + void(*cbfunc)(char*,EnchantTrieMatcher*), + void* cbdata) { EnchantTrieMatcher* matcher; char * normalized_word, * pattern; @@ -1094,7 +1094,9 @@ static EnchantTrieMatcher* enchant_trie_matcher_init(const char* const word, matcher = g_new(EnchantTrieMatcher,1); matcher->num_errors = 0; matcher->max_errors = maxerrs; - matcher->word = pattern; + matcher->word = g_new0(char,len+maxerrs+1); // Ensure matcher does not overrun buffer + strcpy(matcher->word, pattern); + g_free(pattern); matcher->word_pos = 0; matcher->path = g_new0(char,len+maxerrs+1); matcher->path[0] = '\0'; |