]> granicus.if.org Git - vim/commitdiff
patch 8.0.1556: may not parse the t_RS response correctly v8.0.1556
authorBram Moolenaar <Bram@vim.org>
Fri, 2 Mar 2018 19:58:42 +0000 (20:58 +0100)
committerBram Moolenaar <Bram@vim.org>
Fri, 2 Mar 2018 19:58:42 +0000 (20:58 +0100)
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.

src/term.c
src/version.c

index 19760f82c58b534676de116a4b465a61b0c3712e..12c4f2e5bd6c2ffef3b8ef48b625f4b96efeb1fc 100644 (file)
@@ -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");
+                           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);
+                           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;
+                       }
                    }
                }
 
index 9a61422a1193927cbd6ee8a37b0b0716a71f31fb..e1f406a430db5f0aae71264565c48e541d11185a 100644 (file)
@@ -778,6 +778,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1556,
 /**/
     1555,
 /**/