]> granicus.if.org Git - vim/commitdiff
patch 8.0.0212: buffer for key name may be too small v8.0.0212
authorBram Moolenaar <Bram@vim.org>
Sun, 22 Jan 2017 14:05:12 +0000 (15:05 +0100)
committerBram Moolenaar <Bram@vim.org>
Sun, 22 Jan 2017 14:05:12 +0000 (15:05 +0100)
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.

src/keymap.h
src/misc2.c
src/version.c

index 9efecfbefd308ea5f69a6d07fda0694c52e1c11c..776a532762ce6589defbb2cda7aa3d9603bfff25 100644 (file)
@@ -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
index bf98a646c85f9f1ea6880de449af81ecefb1e557..26d5970f9a34cd00e46a8a1401a1543dec163487 100644 (file)
@@ -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 modifiers)
     }
     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;
index 8e33c9681a8ddad1a7a76fdaff2c738318eaf754..741b8da1e94b28bbb4889a54390a0afb88bec25f 100644 (file)
@@ -764,6 +764,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    212,
 /**/
     211,
 /**/