diff options
author | Bram Moolenaar <Bram@vim.org> | 2018-03-02 20:58:42 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2018-03-02 20:58:42 +0100 |
commit | 590ec878a52b3b3d4453475f1eb4899f2b37969f (patch) | |
tree | caeccd92e3481bdd0bb9d3078cd2f9a12215dfc4 | |
parent | 77780b66f4c5573df999a7319d77a852ea4ca837 (diff) | |
download | vim-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.c | 59 | ||||
-rw-r--r-- | src/version.c | 2 |
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, |