changeset 9330:8cb76e38c346 v7.4.1947

commit https://github.com/vim/vim/commit/ecefe71704850b94df44f65fc756c1551ec68388 Author: Bram Moolenaar <Bram@vim.org> Date: Mon Jun 20 12:50:17 2016 +0200 patch 7.4.1947 Problem: Viminfo continuation line with wrong length isn't skipped. (Marius Gedminas) Solution: Skip a line when encountering an error, but not two lines.
author Christian Brabandt <cb@256bit.org>
date Mon, 20 Jun 2016 13:00:07 +0200
parents 72bada9d08cf
children 67d56b233da7
files src/ex_cmds.c src/version.c
diffstat 2 files changed, 27 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -2559,8 +2559,9 @@ barline_writestring(FILE *fd, char_u *s,
 /*
  * Parse a viminfo line starting with '|'.
  * Add each decoded value to "values".
+ * Returns TRUE if the next line is to be read after using the parsed values.
  */
-    static void
+    static int
 barline_parse(vir_T *virp, char_u *text, garray_T *values)
 {
     char_u  *p = text;
@@ -2569,6 +2570,7 @@ barline_parse(vir_T *virp, char_u *text,
     bval_T  *value;
     int	    i;
     int	    allocated = FALSE;
+    int	    eof;
 #ifdef FEAT_MBYTE
     char_u  *sconv;
     int	    converted;
@@ -2611,21 +2613,24 @@ barline_parse(vir_T *virp, char_u *text,
 		 *     |{bartype},>{length of "{text}{text2}"}
 		 *     |<"{text1}
 		 *     |<{text2}",{value}
+		 * Length includes the quotes.
 		 */
 		++p;
 		len = getdigits(&p);
 		buf = alloc((int)(len + 1));
 		if (buf == NULL)
-		    return;
+		    return TRUE;
 		p = buf;
 		for (todo = len; todo > 0; todo -= n)
 		{
-		    if (viminfo_readline(virp) || virp->vir_line[0] != '|'
+		    eof = viminfo_readline(virp);
+		    if (eof || virp->vir_line[0] != '|'
 						  || virp->vir_line[1] != '<')
 		    {
-			/* file was truncated or garbled */
+			/* File was truncated or garbled. Read another line if
+			 * this one starts with '|'. */
 			vim_free(buf);
-			return;
+			return eof || virp->vir_line[0] == '|';
 		    }
 		    /* Get length of text, excluding |< and NL chars. */
 		    n = STRLEN(virp->vir_line);
@@ -2651,10 +2656,12 @@ barline_parse(vir_T *virp, char_u *text,
 		 *     |{bartype},{lots of values},>
 		 *     |<{value},{value}
 		 */
-		if (viminfo_readline(virp) || virp->vir_line[0] != '|'
+		eof = viminfo_readline(virp);
+		if (eof || virp->vir_line[0] != '|'
 					      || virp->vir_line[1] != '<')
-		    /* file was truncated or garbled */
-		    return;
+		    /* File was truncated or garbled. Read another line if
+		     * this one starts with '|'. */
+		    return eof || virp->vir_line[0] == '|';
 		p = virp->vir_line + 2;
 	    }
 	}
@@ -2675,7 +2682,7 @@ barline_parse(vir_T *virp, char_u *text,
 	    while (*p != '"')
 	    {
 		if (*p == NL || *p == NUL)
-		    return;  /* syntax error, drop the value */
+		    return TRUE;  /* syntax error, drop the value */
 		if (*p == '\\')
 		{
 		    ++p;
@@ -2734,6 +2741,7 @@ barline_parse(vir_T *virp, char_u *text,
 	else
 	    break;
     }
+    return TRUE;
 }
 
     static int
@@ -2744,6 +2752,7 @@ read_viminfo_barline(vir_T *virp, int go
     garray_T	values;
     bval_T	*vp;
     int		i;
+    int		read_next = TRUE;
 
     /* The format is: |{bartype},{value},...
      * For a very long string:
@@ -2772,7 +2781,7 @@ read_viminfo_barline(vir_T *virp, int go
 		 * doesn't understand the version. */
 		if (!got_encoding)
 		{
-		    barline_parse(virp, p, &values);
+		    read_next = barline_parse(virp, p, &values);
 		    vp = (bval_T *)values.ga_data;
 		    if (values.ga_len > 0 && vp->bv_type == BVAL_NR)
 			virp->vir_version = vp->bv_nr;
@@ -2780,17 +2789,17 @@ read_viminfo_barline(vir_T *virp, int go
 		break;
 
 	    case BARTYPE_HISTORY:
-		barline_parse(virp, p, &values);
+		read_next = barline_parse(virp, p, &values);
 		handle_viminfo_history(&values, writing);
 		break;
 
 	    case BARTYPE_REGISTER:
-		barline_parse(virp, p, &values);
+		read_next = barline_parse(virp, p, &values);
 		handle_viminfo_register(&values, force);
 		break;
 
 	    case BARTYPE_MARK:
-		barline_parse(virp, p, &values);
+		read_next = barline_parse(virp, p, &values);
 		handle_viminfo_mark(&values, force);
 		break;
 
@@ -2808,7 +2817,9 @@ read_viminfo_barline(vir_T *virp, int go
 	ga_clear(&values);
     }
 
-    return viminfo_readline(virp);
+    if (read_next)
+	return viminfo_readline(virp);
+    return FALSE;
 }
 
     static void
--- a/src/version.c
+++ b/src/version.c
@@ -754,6 +754,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1947,
+/**/
     1946,
 /**/
     1945,