0
0
mirror of https://github.com/vim/vim.git synced 2025-09-30 04:44:14 -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; int cells;
item = ((balpart_T *)ga.ga_data) + item_idx; item = ((balpart_T *)ga.ga_data) + item_idx;
for (skip = 0; skip < item->bytelen; skip += thislen) if (item->bytelen == 0)
{ (*array)[line++].pum_text = vim_strsave((char_u *)"");
if (split_long_items && item->cells >= BALLOON_MIN_WIDTH) else
for (skip = 0; skip < item->bytelen; skip += thislen)
{ {
cells = item->indent * 2; if (split_long_items && item->cells >= BALLOON_MIN_WIDTH)
for (p = item->start + skip; p < item->start + item->bytelen; {
cells = item->indent * 2;
for (p = item->start + skip;
p < item->start + item->bytelen;
p += mb_ptr2len(p)) 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; 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); ga_clear(&ga);
return height; return height;

View File

@@ -795,6 +795,12 @@ func Test_balloon_split()
\ ' next = 123}', \ ' next = 123}',
\ ], balloon_split( \ ], balloon_split(
\ 'struct = 0x234 {long = 2343 "\\"some long string that will be wrapped in two\\"", next = 123}')) \ 'struct = 0x234 {long = 2343 "\\"some long string that will be wrapped in two\\"", next = 123}'))
call assert_equal([
\ 'Some comment',
\ '',
\ 'typedef this that;',
\ ], balloon_split(
\ "Some comment\n\ntypedef this that;"))
endfunc endfunc
func Test_popup_position() func Test_popup_position()

View File

@@ -741,6 +741,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
2325,
/**/ /**/
2324, 2324,
/**/ /**/