changeset 16178:a8689ea2e869 v8.1.1094

patch 8.1.1094: long line in tags file causes error commit https://github.com/vim/vim/commit/5209334c551778fe6f76945f373ee14fcac96f52 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Mar 30 21:41:48 2019 +0100 patch 8.1.1094: long line in tags file causes error Problem: Long line in tags file causes error. Solution: Check for overlong line earlier. (Andy Massimino, closes https://github.com/vim/vim/issues/4051, closes #4084)
author Bram Moolenaar <Bram@vim.org>
date Sat, 30 Mar 2019 21:45:05 +0100
parents 8ac126587969
children 3dbabe1dc0b4
files src/tag.c src/testdir/test_tagjump.vim src/version.c
diffstat 3 files changed, 59 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/src/tag.c
+++ b/src/tag.c
@@ -1921,6 +1921,32 @@ line_read_in:
 	    }
 
 parse_line:
+	    if (vim_strchr(lbuf, NL) == NULL
+#ifdef FEAT_CSCOPE
+					     && !use_cscope
+#endif
+					     )
+	    {
+		// Truncated line, ignore it.  Has been reported for
+		// Mozilla JS with extremely long names.
+		if (p_verbose >= 5)
+		{
+		    verbose_enter();
+		    msg(_("Ignoring long line in tags file"));
+		    verbose_leave();
+		}
+#ifdef FEAT_TAG_BINS
+		if (state != TS_LINEAR)
+		{
+		    // Avoid getting stuck.
+		    linear = TRUE;
+		    state = TS_LINEAR;
+		    vim_fseek(fp, search_info.low_offset, SEEK_SET);
+		}
+#endif
+		continue;
+	    }
+
 	    /*
 	     * Figure out where the different strings are in this line.
 	     * For "normal" tags: Do a quick check if the tag matches.
@@ -1937,28 +1963,6 @@ parse_line:
 		tagp.tagname_end = vim_strchr(lbuf, TAB);
 		if (tagp.tagname_end == NULL)
 		{
-		    if (vim_strchr(lbuf, NL) == NULL)
-		    {
-			/* Truncated line, ignore it.  Has been reported for
-			 * Mozilla JS with extremely long names. */
-			if (p_verbose >= 5)
-			{
-			    verbose_enter();
-			    msg(_("Ignoring long line in tags file"));
-			    verbose_leave();
-			}
-#ifdef FEAT_TAG_BINS
-			if (state != TS_LINEAR)
-			{
-			    /* Avoid getting stuck. */
-			    linear = TRUE;
-			    state = TS_LINEAR;
-			    vim_fseek(fp, search_info.low_offset, SEEK_SET);
-			}
-#endif
-			continue;
-		    }
-
 		    /* Corrupted tag line. */
 		    line_error = TRUE;
 		    break;
--- a/src/testdir/test_tagjump.vim
+++ b/src/testdir/test_tagjump.vim
@@ -439,4 +439,35 @@ func Test_tagnr_recall()
   call delete('Xtest.c')
 endfunc
 
+func Test_tag_line_toolong()
+  call writefile([
+	\ '1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678	django/contrib/admin/templates/admin/edit_inline/stacked.html	16;"	j	line:16	language:HTML'
+	\ ], 'Xtags')
+  set tags=Xtags
+  let old_vbs = &verbose
+  set verbose=5
+  " ":tjump" should give "tag not found" not "Format error in tags file"
+  call assert_fails('tj /foo', 'E426')
+  try
+    tj /foo
+  catch /^Vim\%((\a\+)\)\=:E431/
+    call assert_report(v:exception)
+  catch /.*/
+  endtry
+  call assert_equal('Ignoring long line in tags file', split(execute('messages'), '\n')[-1])
+  call writefile([
+	\ '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567	django/contrib/admin/templates/admin/edit_inline/stacked.html	16;"	j	line:16	language:HTML'
+	\ ], 'Xtags')
+  call assert_fails('tj /foo', 'E426')
+  try
+    tj /foo
+  catch /^Vim\%((\a\+)\)\=:E431/
+    call assert_report(v:exception)
+  catch /.*/
+  endtry
+  call assert_equal('Ignoring long line in tags file', split(execute('messages'), '\n')[-1])
+  call delete('Xtags')
+  let &verbose = old_vbs
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab
--- a/src/version.c
+++ b/src/version.c
@@ -772,6 +772,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1094,
+/**/
     1093,
 /**/
     1092,