]> granicus.if.org Git - vim/commitdiff
patch 8.1.2325: crash when using balloon with empty line v8.1.2325
authorBram Moolenaar <Bram@vim.org>
Thu, 21 Nov 2019 12:27:06 +0000 (13:27 +0100)
committerBram Moolenaar <Bram@vim.org>
Thu, 21 Nov 2019 12:27:06 +0000 (13:27 +0100)
Problem:    Crash when using balloon with empty line.
Solution:   Handle empty lines. (Markus Braun)

src/popupmenu.c
src/testdir/test_popup.vim
src/version.c

index 10d367a3b201d94bbf746c2597e234cf9ee4ed20..4d1d84565567c2818a240df1d8b93c704057f5d8 100644 (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)
-                       break;
-               thislen = p - (item->start + skip);
-           }
-           else
-               thislen = item->bytelen;
+                       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] = ' ';
+               // 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;
+               // 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;
-       }
+               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;
index 5b602cc12e98ec36435025f41eadddc60b20222f..21bd22ade21ad1d9be6d122068139d979b6c747b 100644 (file)
@@ -795,6 +795,12 @@ func Test_balloon_split()
         \ '  next = 123}',
         \ ], balloon_split(
         \ '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
 
 func Test_popup_position()
index 0d8d597b3ada97274af93ece350e57ddd187c141..c448e57fd65d00d7a60f30c5201044d317480ba0 100644 (file)
@@ -741,6 +741,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2325,
 /**/
     2324,
 /**/