From 12e21e387b5bbc928097abf1c189b7dc665838fc Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Wed, 27 Apr 2022 11:58:01 +0100 Subject: patch 8.2.4833: failure of mapping not checked for Problem: Failure of mapping not checked for. Solution: Check return value of ins_typebuf(). (closes #10299) --- src/getchar.c | 18 ++++++++++++++++-- src/term.c | 4 +++- src/testdir/test_termcodes.vim | 5 +++-- src/version.c | 2 ++ 4 files changed, 24 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/getchar.c b/src/getchar.c index e208dd1a1..e6879c60d 100644 --- a/src/getchar.c +++ b/src/getchar.c @@ -2363,7 +2363,7 @@ at_ctrl_x_key(void) * into just a key, apply that. * Check from typebuf.tb_buf[typebuf.tb_off] to typebuf.tb_buf[typebuf.tb_off * + "max_offset"]. - * Return the length of the replaced bytes, zero if nothing changed. + * Return the length of the replaced bytes, 0 if nothing changed, -1 for error. */ static int check_simplify_modifier(int max_offset) @@ -2397,7 +2397,15 @@ check_simplify_modifier(int max_offset) vgetc_char = c; vgetc_mod_mask = tp[2]; } - len = mb_char2bytes(new_c, new_string); + if (IS_SPECIAL(new_c)) + { + new_string[0] = K_SPECIAL; + new_string[1] = K_SECOND(new_c); + new_string[2] = K_THIRD(new_c); + len = 3; + } + else + len = mb_char2bytes(new_c, new_string); if (modifier == 0) { if (put_string_in_typebuf(offset, 4, new_string, len, @@ -2424,6 +2432,7 @@ check_simplify_modifier(int max_offset) * - When nothing mapped and typeahead has a character: return map_result_get. * - When there is no match yet, return map_result_nomatch, need to get more * typeahead. + * - On failure (out of memory) return map_result_fail. */ static int handle_mapping( @@ -2706,7 +2715,12 @@ handle_mapping( // If no termcode matched, try to include the modifier into the // key. This is for when modifyOtherKeys is working. if (keylen == 0 && !no_reduce_keys) + { keylen = check_simplify_modifier(max_mlen + 1); + if (keylen < 0) + // ins_typebuf() failed + return map_result_fail; + } // When getting a partial match, but the last characters were not // typed, don't wait for a typed character to complete the diff --git a/src/term.c b/src/term.c index 14cee6ac2..ee8be7f8f 100644 --- a/src/term.c +++ b/src/term.c @@ -4531,7 +4531,9 @@ put_string_in_typebuf( del_typebuf(-extra, offset); else if (extra > 0) // insert the extra space we need - ins_typebuf(string + slen, REMAP_YES, offset, FALSE, FALSE); + if (ins_typebuf(string + slen, REMAP_YES, offset, FALSE, FALSE) + == FAIL) + return FAIL; // Careful: del_typebuf() and ins_typebuf() may have reallocated // typebuf.tb_buf[]! diff --git a/src/testdir/test_termcodes.vim b/src/testdir/test_termcodes.vim index ddbe707d1..c9b0c7b73 100644 --- a/src/testdir/test_termcodes.vim +++ b/src/testdir/test_termcodes.vim @@ -2439,8 +2439,9 @@ endfunc func Test_simplify_ctrl_at() " feeding unsimplified CTRL-@ should still trigger i_CTRL-@ - call feedkeys("ifoo\A\<*C-@>", 'xt') - call assert_equal('foofoo', getline(1)) + call feedkeys("ifoo\A\<*C-@>x", 'xt') + call assert_equal('foofo', getline(1)) + bw! endfunc diff --git a/src/version.c b/src/version.c index 115989cac..a8f6671d9 100644 --- a/src/version.c +++ b/src/version.c @@ -746,6 +746,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4833, /**/ 4832, /**/ -- cgit v1.2.1