1
0
forked from aniani/vim

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)
This commit is contained in:
zeertzjq
2022-04-27 11:58:01 +01:00
committed by Bram Moolenaar
parent fc78a0369e
commit 12e21e387b
4 changed files with 24 additions and 5 deletions

View File

@@ -2363,7 +2363,7 @@ at_ctrl_x_key(void)
* into just a key, apply that. * into just a key, apply that.
* Check from typebuf.tb_buf[typebuf.tb_off] to typebuf.tb_buf[typebuf.tb_off * Check from typebuf.tb_buf[typebuf.tb_off] to typebuf.tb_buf[typebuf.tb_off
* + "max_offset"]. * + "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 static int
check_simplify_modifier(int max_offset) check_simplify_modifier(int max_offset)
@@ -2397,7 +2397,15 @@ check_simplify_modifier(int max_offset)
vgetc_char = c; vgetc_char = c;
vgetc_mod_mask = tp[2]; 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 (modifier == 0)
{ {
if (put_string_in_typebuf(offset, 4, new_string, len, 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 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 * - When there is no match yet, return map_result_nomatch, need to get more
* typeahead. * typeahead.
* - On failure (out of memory) return map_result_fail.
*/ */
static int static int
handle_mapping( handle_mapping(
@@ -2706,7 +2715,12 @@ handle_mapping(
// If no termcode matched, try to include the modifier into the // If no termcode matched, try to include the modifier into the
// key. This is for when modifyOtherKeys is working. // key. This is for when modifyOtherKeys is working.
if (keylen == 0 && !no_reduce_keys) if (keylen == 0 && !no_reduce_keys)
{
keylen = check_simplify_modifier(max_mlen + 1); 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 // When getting a partial match, but the last characters were not
// typed, don't wait for a typed character to complete the // typed, don't wait for a typed character to complete the

View File

@@ -4531,7 +4531,9 @@ put_string_in_typebuf(
del_typebuf(-extra, offset); del_typebuf(-extra, offset);
else if (extra > 0) else if (extra > 0)
// insert the extra space we need // 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 // Careful: del_typebuf() and ins_typebuf() may have reallocated
// typebuf.tb_buf[]! // typebuf.tb_buf[]!

View File

@@ -2439,8 +2439,9 @@ endfunc
func Test_simplify_ctrl_at() func Test_simplify_ctrl_at()
" feeding unsimplified CTRL-@ should still trigger i_CTRL-@ " feeding unsimplified CTRL-@ should still trigger i_CTRL-@
call feedkeys("ifoo\<Esc>A\<*C-@>", 'xt') call feedkeys("ifoo\<Esc>A\<*C-@>x", 'xt')
call assert_equal('foofoo', getline(1)) call assert_equal('foofo', getline(1))
bw!
endfunc endfunc

View File

@@ -746,6 +746,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
4833,
/**/ /**/
4832, 4832,
/**/ /**/