changeset 10644:2025bec9175f v8.0.0212

patch 8.0.0212: buffer for key name may be too small commit https://github.com/vim/vim/commit/423977d3cebac2be1158b1d11da60fe96db4b750 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Jan 22 15:05:12 2017 +0100 patch 8.0.0212: buffer for key name may be too small Problem: The buffer used to store a key name theoreticaly could be too small. (Coverity) Solution: Count all possible modifier characters. Add a check for the length just in case.
author Christian Brabandt <cb@256bit.org>
date Sun, 22 Jan 2017 15:15:04 +0100
parents 9eee1718dcc6
children b3aee1f74787
files src/keymap.h src/misc2.c src/version.c
diffstat 3 files changed, 14 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/keymap.h
+++ b/src/keymap.h
@@ -482,9 +482,10 @@ enum key_extra
 
 /*
  * The length of the longest special key name, including modifiers.
- * Current longest is <M-C-S-T-4-MiddleRelease> (length includes '<' and '>').
+ * Current longest is <M-C-S-T-D-A-4-ScrollWheelRight> (length includes '<' and
+ * '>').
  */
-#define MAX_KEY_NAME_LEN    25
+#define MAX_KEY_NAME_LEN    32
 
 /* Maximum length of a special key event as tokens.  This includes modifiers.
  * The longest event is something like <M-C-S-T-4-LeftDrag> which would be the
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -2162,6 +2162,7 @@ static struct modmasktable
     /* 'A' must be the last one */
     {MOD_MASK_ALT,		MOD_MASK_ALT,		(char_u)'A'},
     {0, 0, NUL}
+    /* NOTE: when adding an entry, update MAX_KEY_NAME_LEN! */
 };
 
 /*
@@ -2431,6 +2432,7 @@ static struct key_name_entry
     {K_PLUG,		(char_u *)"Plug"},
     {K_CURSORHOLD,	(char_u *)"CursorHold"},
     {0,			NULL}
+    /* NOTE: When adding a long name update MAX_KEY_NAME_LEN. */
 };
 
 #define KEY_NAMES_TABLE_LEN (sizeof(key_names_table) / sizeof(struct key_name_entry))
@@ -2659,8 +2661,13 @@ get_special_key_name(int c, int modifier
     }
     else		/* use name of special key */
     {
-	STRCPY(string + idx, key_names_table[table_idx].name);
-	idx = (int)STRLEN(string);
+	size_t len = STRLEN(key_names_table[table_idx].name);
+
+	if (len + idx + 2 <= MAX_KEY_NAME_LEN)
+	{
+	    STRCPY(string + idx, key_names_table[table_idx].name);
+	    idx += (int)len;
+	}
     }
     string[idx++] = '>';
     string[idx] = NUL;
--- a/src/version.c
+++ b/src/version.c
@@ -765,6 +765,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    212,
+/**/
     211,
 /**/
     210,