diff options
author | Thiago de Arruda <tpadilha84@gmail.com> | 2015-02-20 14:37:03 -0300 |
---|---|---|
committer | Thiago de Arruda <tpadilha84@gmail.com> | 2015-02-21 05:09:02 -0300 |
commit | 6293b5513c54557bbf56077374df83cb52344fa3 (patch) | |
tree | edc8d4310b1e4025697a4ae0e9f39c2973fb3725 /src | |
parent | eb8f6bec86c750de868360f50e0f21eb569325de (diff) | |
download | rneovim-6293b5513c54557bbf56077374df83cb52344fa3.tar.gz rneovim-6293b5513c54557bbf56077374df83cb52344fa3.tar.bz2 rneovim-6293b5513c54557bbf56077374df83cb52344fa3.zip |
tui: Use unibi_format instead of unibi_run
The current will segfault for large chunks of output because the output buffer
will be overrun.
Using unibi_format is simple because we can simply flush the buffer when its
full.
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/tui/tui.c | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/src/nvim/tui/tui.c b/src/nvim/tui/tui.c index 7aece48505..0d366c2325 100644 --- a/src/nvim/tui/tui.c +++ b/src/nvim/tui/tui.c @@ -250,7 +250,7 @@ static void update_attrs(UI *ui, HlAttrs attrs) static void print_cell(UI *ui, Cell *ptr) { update_attrs(ui, ptr->attrs); - out(ui, ptr->data); + out(ui, ptr->data, strlen(ptr->data)); } static void clear_region(UI *ui, int top, int bot, int left, int right, @@ -540,12 +540,12 @@ static void tui_suspend(UI *ui) static void tui_set_title(UI *ui, char *title) { TUIData *data = ui->data; - if (!(unibi_get_str(data->ut, unibi_to_status_line) - && unibi_get_str(data->ut, unibi_from_status_line))) { + if (!(title && unibi_get_str(data->ut, unibi_to_status_line) && + unibi_get_str(data->ut, unibi_from_status_line))) { return; } unibi_out(ui, unibi_to_status_line); - out(ui, title); + out(ui, title, strlen(title)); unibi_out(ui, unibi_from_status_line); } @@ -648,16 +648,23 @@ static void unibi_out(UI *ui, int unibi_index) } if (str) { - data->bufpos += unibi_run(str, data->params, data->buf + data->bufpos, - sizeof(data->buf) - data->bufpos); + unibi_var_t vars[26 + 26] = {{0}}; + unibi_format(vars, vars + 26, str, data->params, out, ui, NULL, NULL); } } -static void out(UI *ui, const char *str) +static void out(void *ctx, const char *str, size_t len) { + UI *ui = ctx; TUIData *data = ui->data; - data->bufpos += (size_t)snprintf(data->buf + data->bufpos, - sizeof(data->buf) - data->bufpos, "%s", str); + size_t available = sizeof(data->buf) - data->bufpos; + + if (len > available) { + flush_buf(ui); + } + + memcpy(data->buf + data->bufpos, str, len); + data->bufpos += len; } static void unibi_set_if_empty(unibi_term *ut, enum unibi_string str, |