summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2017-01-22 15:05:12 +0100
committerBram Moolenaar <Bram@vim.org>2017-01-22 15:05:12 +0100
commit423977d3cebac2be1158b1d11da60fe96db4b750 (patch)
tree01c4beffd9aae804a18666257467926fd0ce2e0c
parent560379d7ae1bace259bbc29a275e73446346ce66 (diff)
downloadvim-git-423977d3cebac2be1158b1d11da60fe96db4b750.tar.gz
patch 8.0.0212: buffer for key name may be too smallv8.0.0212
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.
-rw-r--r--src/keymap.h5
-rw-r--r--src/misc2.c11
-rw-r--r--src/version.c2
3 files changed, 14 insertions, 4 deletions
diff --git a/src/keymap.h b/src/keymap.h
index 9efecfbef..776a53276 100644
--- 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
diff --git a/src/misc2.c b/src/misc2.c
index bf98a646c..26d5970f9 100644
--- 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 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;
diff --git a/src/version.c b/src/version.c
index 8e33c9681..741b8da1e 100644
--- 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,