summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2022-04-27 11:58:01 +0100
committerBram Moolenaar <Bram@vim.org>2022-04-27 11:58:01 +0100
commit12e21e387b5bbc928097abf1c189b7dc665838fc (patch)
tree71ec4c8aa2bb205ec22780ba1ed687b17f600287
parentfc78a0369e0d371a1a85d07045ff25d8695e8f8c (diff)
patch 8.2.4833: failure of mapping not checked forv8.2.4833
Problem: Failure of mapping not checked for. Solution: Check return value of ins_typebuf(). (closes #10299)
-rw-r--r--src/getchar.c18
-rw-r--r--src/term.c4
-rw-r--r--src/testdir/test_termcodes.vim5
-rw-r--r--src/version.c2
4 files changed, 24 insertions, 5 deletions
diff --git a/src/getchar.c b/src/getchar.c
index e208dd1a18..e6879c60d9 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 14cee6ac26..ee8be7f8fc 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 ddbe707d10..c9b0c7b735 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\<Esc>A\<*C-@>", 'xt')
- call assert_equal('foofoo', getline(1))
+ call feedkeys("ifoo\<Esc>A\<*C-@>x", 'xt')
+ call assert_equal('foofo', getline(1))
+ bw!
endfunc
diff --git a/src/version.c b/src/version.c
index 115989cac4..a8f6671d9a 100644
--- a/src/version.c
+++ b/src/version.c
@@ -747,6 +747,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 4833,
+/**/
4832,
/**/
4831,