0
0
mirror of https://github.com/vim/vim.git synced 2025-09-29 04:34:16 -04:00

patch 8.1.2325: crash when using balloon with empty line

Problem:    Crash when using balloon with empty line.
Solution:   Handle empty lines. (Markus Braun)
This commit is contained in:
Bram Moolenaar
2019-11-21 13:27:06 +01:00
parent 202c3f7e3e
commit 9ae862ebba
3 changed files with 44 additions and 32 deletions

View File

@@ -1209,42 +1209,46 @@ split_message(char_u *mesg, pumitem_T **array)
int cells;
item = ((balpart_T *)ga.ga_data) + item_idx;
for (skip = 0; skip < item->bytelen; skip += thislen)
{
if (split_long_items && item->cells >= BALLOON_MIN_WIDTH)
if (item->bytelen == 0)
(*array)[line++].pum_text = vim_strsave((char_u *)"");
else
for (skip = 0; skip < item->bytelen; skip += thislen)
{
cells = item->indent * 2;
for (p = item->start + skip; p < item->start + item->bytelen;
if (split_long_items && item->cells >= BALLOON_MIN_WIDTH)
{
cells = item->indent * 2;
for (p = item->start + skip;
p < item->start + item->bytelen;
p += mb_ptr2len(p))
if ((cells += ptr2cells(p)) > BALLOON_MIN_WIDTH)
if ((cells += ptr2cells(p)) > BALLOON_MIN_WIDTH)
break;
thislen = p - (item->start + skip);
}
else
thislen = item->bytelen;
// put indent at the start
p = alloc(thislen + item->indent * 2 + 1);
if (p == NULL)
{
for (line = 0; line <= height - 1; ++line)
vim_free((*array)[line].pum_text);
vim_free(*array);
goto failed;
}
for (ind = 0; ind < item->indent * 2; ++ind)
p[ind] = ' ';
// exclude spaces at the end of the string
for (copylen = thislen; copylen > 0; --copylen)
if (item->start[skip + copylen - 1] != ' ')
break;
thislen = p - (item->start + skip);
vim_strncpy(p + ind, item->start + skip, copylen);
(*array)[line].pum_text = p;
item->indent = 0; /* wrapped line has no indent */
++line;
}
else
thislen = item->bytelen;
// put indent at the start
p = alloc(thislen + item->indent * 2 + 1);
if (p == NULL)
{
for (line = 0; line <= height - 1; ++line)
vim_free((*array)[line].pum_text);
vim_free(*array);
goto failed;
}
for (ind = 0; ind < item->indent * 2; ++ind)
p[ind] = ' ';
// exclude spaces at the end of the string
for (copylen = thislen; copylen > 0; --copylen)
if (item->start[skip + copylen - 1] != ' ')
break;
vim_strncpy(p + ind, item->start + skip, copylen);
(*array)[line].pum_text = p;
item->indent = 0; /* wrapped line has no indent */
++line;
}
}
ga_clear(&ga);
return height;