changeset 13365:c6bafddbfa33 v8.0.1556

patch 8.0.1556: may not parse the t_RS response correctly commit https://github.com/vim/vim/commit/590ec878a52b3b3d4453475f1eb4899f2b37969f Author: Bram Moolenaar <Bram@vim.org> Date: Fri Mar 2 20:58:42 2018 +0100 patch 8.0.1556: may not parse the t_RS response correctly Problem: May not parse the t_RS response correctly, resulting in wrong characters in the input stream. Solution: When the t_RS response is partly received wait for more characters.
author Christian Brabandt <cb@256bit.org>
date Fri, 02 Mar 2018 21:00:07 +0100
parents 53c7faf39d64
children 00577b3b9aae
files src/term.c src/version.c
diffstat 2 files changed, 38 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/src/term.c
+++ b/src/term.c
@@ -4866,7 +4866,7 @@ check_termcode(
 	     * {tail} can be Esc>\ or STERM
 	     *
 	     * Check for cursor shape response from xterm:
-	     * {lead}1$r<number> q{tail}
+	     * {lead}1$r<digit> q{tail}
 	     *
 	     * {lead} can be <Esc>P or DCS
 	     * {tail} can be Esc>\ or STERM
@@ -4897,35 +4897,46 @@ check_termcode(
 			break;
 		    }
 		  }
-		else if ((len >= j + 6 && isdigit(argp[3]))
-			&& argp[4] == ' '
-			&& argp[5] == 'q')
+		else
 		{
-		    /* cursor shape response */
-		    i = j + 6;
-		    if ((tp[i] == ESC && i + 1 < len && tp[i + 1] == '\\')
-			    || tp[i] == STERM)
+		    /* Probably the cursor shape response.  Make sure that "i"
+		     * is equal to "len" when there are not sufficient
+		     * characters. */
+		    for (i = j + 3; i < len; ++i)
 		    {
-			int number = argp[3] - '0';
-
-			/* 0, 1 = block blink, 2 = block
-			 * 3 = underline blink, 4 = underline
-			 * 5 = vertical bar blink, 6 = vertical bar */
-			number = number == 0 ? 1 : number;
-			initial_cursor_shape = (number + 1) / 2;
-			/* The blink flag is actually inverted, compared to
-			 * the value set with T_SH. */
-			initial_cursor_shape_blink =
+			if (i - j == 3 && !isdigit(tp[i]))
+			    break;
+			if (i - j == 4 && tp[i] != ' ')
+			    break;
+			if (i - j == 5 && tp[i] != 'q')
+			    break;
+			if (i - j == 6 && tp[i] != ESC && tp[i] != STERM)
+			    break;
+			if ((i - j == 6 && tp[i] == STERM)
+			 || (i - j == 7 && tp[i] == '\\'))
+			{
+			    int number = argp[3] - '0';
+
+			    /* 0, 1 = block blink, 2 = block
+			     * 3 = underline blink, 4 = underline
+			     * 5 = vertical bar blink, 6 = vertical bar */
+			    number = number == 0 ? 1 : number;
+			    initial_cursor_shape = (number + 1) / 2;
+			    /* The blink flag is actually inverted, compared to
+			     * the value set with T_SH. */
+			    initial_cursor_shape_blink =
 						   (number & 1) ? FALSE : TRUE;
-			rcs_status = STATUS_GOT;
-			LOG_TR("Received cursor shape response");
-
-			key_name[0] = (int)KS_EXTRA;
-			key_name[1] = (int)KE_IGNORE;
-			slen = i + 1 + (tp[i] == ESC);
+			    rcs_status = STATUS_GOT;
+			    LOG_TR("Received cursor shape response");
+
+			    key_name[0] = (int)KS_EXTRA;
+			    key_name[1] = (int)KE_IGNORE;
+			    slen = i + 1;
 # ifdef FEAT_EVAL
-			set_vim_var_string(VV_TERMSTYLERESP, tp, slen);
+			    set_vim_var_string(VV_TERMSTYLERESP, tp, slen);
 # endif
+			    break;
+			}
 		    }
 		}
 
--- a/src/version.c
+++ b/src/version.c
@@ -779,6 +779,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1556,
+/**/
     1555,
 /**/
     1554,