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.
diff --git a/src/keymap.h b/src/keymap.h
index 9efecfb..776a532 100644
--- a/src/keymap.h
+++ b/src/keymap.h
@@ -482,9 +482,10 @@
/*
* 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
diff --git a/src/misc2.c b/src/misc2.c
index bf98a64..26d5970 100644
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -2162,6 +2162,7 @@
/* '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 @@
{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 @@
}
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;
diff --git a/src/version.c b/src/version.c
index 8e33c96..741b8da 100644
--- a/src/version.c
+++ b/src/version.c
@@ -765,6 +765,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 212,
+/**/
211,
/**/
210,