diff options
author | Nei <ailin.nemui@gmail.com> | 2018-01-04 22:19:29 +0000 |
---|---|---|
committer | Nei <ailin.nemui@gmail.com> | 2018-01-04 22:19:29 +0000 |
commit | 94f0cbe34a2089d00ba1bf61e9c2b28318f953b9 (patch) | |
tree | 58a98dc99c28618ada7b155922ecfa7446f4228c /src | |
parent | cf70fcd4b9b035e600462e8e5fa895c82741e721 (diff) | |
parent | 2361d4b1e5d38701f35146219ceddd318ac4e645 (diff) | |
download | irssi-94f0cbe34a2089d00ba1bf61e9c2b28318f953b9.zip |
Merge branch 'fix-gl-19' into 'security'
rewrite completion code and check for direct match of separator
See merge request irssi/irssi!27
Diffstat (limited to 'src')
-rw-r--r-- | src/fe-common/core/completion.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/src/fe-common/core/completion.c b/src/fe-common/core/completion.c index e78fe7d5..fd452e5c 100644 --- a/src/fe-common/core/completion.c +++ b/src/fe-common/core/completion.c @@ -187,12 +187,18 @@ char *word_complete(WINDOW_REC *window, const char *line, int *pos, int erase, i char *old; old = linestart; - linestart = *linestart == '\0' ? - g_strdup(word) : - g_strdup_printf("%s%c%s", - /* do not accidentally duplicate the word separator */ - line == wordstart - 1 ? "" : linestart, - old_wordstart[-1], word); + /* we want to move word into linestart */ + if (*linestart == '\0') { + linestart = g_strdup(word); + } else { + GString *str = g_string_new(linestart); + if (old_wordstart[-1] != str->str[str->len - 1]) { + /* do not accidentally duplicate the word separator */ + g_string_append_c(str, old_wordstart[-1]); + } + g_string_append(str, word); + linestart = g_string_free(str, FALSE); + } g_free(old); g_free(word); |