]> granicus.if.org Git - vim/commitdiff
patch 7.4.1918 v7.4.1918
authorBram Moolenaar <Bram@vim.org>
Sat, 11 Jun 2016 13:31:47 +0000 (15:31 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 11 Jun 2016 13:31:47 +0000 (15:31 +0200)
Problem:    Not enough testing for parsing viminfo lines.
Solution:   Add test with viminfo lines in bad syntax.  Fix memory leak.

src/ex_cmds.c
src/ex_getln.c
src/testdir/test_viminfo.vim
src/version.c

index 37e8e4c33cc474cf3f68d20b9b8444006fd8e81d..63af5eb54b120842ae13c2010567b96b2a74f20a 100644 (file)
@@ -2589,13 +2589,18 @@ barline_parse(vir_T *virp, char_u *text, bval_T *values)
                ++p;
                len = getdigits(&p);
                buf = alloc((int)(len + 1));
+               if (buf == NULL)
+                   return count;
                p = buf;
                for (todo = len; todo > 0; todo -= n)
                {
                    if (viminfo_readline(virp) || virp->vir_line[0] != '|'
                                                  || virp->vir_line[1] != '<')
+                   {
                        /* file was truncated or garbled */
-                       return 0;
+                       vim_free(buf);
+                       return count;
+                   }
                    /* Get length of text, excluding |< and NL chars. */
                    n = STRLEN(virp->vir_line);
                    while (n > 0 && (virp->vir_line[n - 1] == NL
@@ -2623,7 +2628,7 @@ barline_parse(vir_T *virp, char_u *text, bval_T *values)
                if (viminfo_readline(virp) || virp->vir_line[0] != '|'
                                              || virp->vir_line[1] != '<')
                    /* file was truncated or garbled */
-                   return 0;
+                   return count;
                p = virp->vir_line + 2;
            }
        }
index 87aed90b06cffd88f7a5c399a0c149c5f88dc3ce..7f019c6636711ce3befb28766fe96281478e992b 100644 (file)
@@ -6471,6 +6471,7 @@ merge_history(int type)
        vim_free(history[type][i].hisstr);
     vim_free(history[type]);
     history[type] = new_hist;
+    vim_free(tot_hist);
 }
 
 /*
index 1fefba1b604be278e2a98ce708fe08549f25d46a..9d55600f9c0967223209c09c7fcd18d0c5b2aee8 100644 (file)
@@ -201,3 +201,22 @@ func Test_viminfo_encoding()
 
   call delete('Xviminfo')
 endfunc
+
+func Test_viminfo_bad_syntax()
+  let lines = []
+  call add(lines, '|<')  " empty continuation line
+  call add(lines, '|234234234234234324,nothing')
+  call add(lines, '|1+"no comma"')
+  call add(lines, '|1,2,3,4,5,6,7')  " too many items
+  call add(lines, '|1,"string version"')
+  call add(lines, '|1,>x') " bad continuation line
+  call add(lines, '|1,"x') " missing quote
+  call add(lines, '|1,"x\') " trailing backslash
+  call add(lines, '|1,,,,') "trailing comma
+  call add(lines, '|1,>234') " trailing continuation line
+  call writefile(lines, 'Xviminfo')
+  call assert_fails('rviminfo Xviminfo', 'E685:')
+
+  call delete('Xviminfo')
+endfunc
+
index 684ec7646a6bab63589e135f5d70ead93bbbcd1a..28b3d62fb8fe9959c1db7c2f68a20c4f469a894d 100644 (file)
@@ -753,6 +753,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1918,
 /**/
     1917,
 /**/