summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2018-03-02 20:58:42 +0100
committerBram Moolenaar <Bram@vim.org>2018-03-02 20:58:42 +0100
commit590ec878a52b3b3d4453475f1eb4899f2b37969f (patch)
treecaeccd92e3481bdd0bb9d3078cd2f9a12215dfc4
parent77780b66f4c5573df999a7319d77a852ea4ca837 (diff)
downloadvim-590ec878a52b3b3d4453475f1eb4899f2b37969f.zip
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.
-rw-r--r--src/term.c59
-rw-r--r--src/version.c2
2 files changed, 37 insertions, 24 deletions
diff --git a/src/term.c b/src/term.c
index 19760f82c..12c4f2e5b 100644
--- 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");
+ 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;
+ }
}
}
diff --git a/src/version.c b/src/version.c
index 9a61422a1..e1f406a43 100644
--- 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,