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:
@@ -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
|
||||||
|
@@ -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[]!
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
|
||||||
|
@@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user