Skip to content

Commit d0b5138

Browse files
committed
patch 8.0.0056
Problem: When setting 'filetype' there is no check for a valid name. Solution: Only allow valid characters in 'filetype', 'syntax' and 'keymap'.
1 parent 3a117e1 commit d0b5138

File tree

3 files changed

+87
-2
lines changed

3 files changed

+87
-2
lines changed

Diff for: src/option.c

+36-2
Original file line numberDiff line numberDiff line change
@@ -5822,6 +5822,21 @@ set_string_option(
58225822
return r;
58235823
}
58245824

5825+
/*
5826+
* Return TRUE if "val" is a valid 'filetype' name.
5827+
* Also used for 'syntax' and 'keymap'.
5828+
*/
5829+
static int
5830+
valid_filetype(char_u *val)
5831+
{
5832+
char_u *s;
5833+
5834+
for (s = val; *s != NUL; ++s)
5835+
if (!ASCII_ISALNUM(*s) && vim_strchr((char_u *)".-_", *s) == NULL)
5836+
return FALSE;
5837+
return TRUE;
5838+
}
5839+
58255840
/*
58265841
* Handle string options that need some action to perform when changed.
58275842
* Returns NULL for success, or an error message for an error.
@@ -6235,8 +6250,11 @@ did_set_string_option(
62356250
#ifdef FEAT_KEYMAP
62366251
else if (varp == &curbuf->b_p_keymap)
62376252
{
6238-
/* load or unload key mapping tables */
6239-
errmsg = keymap_init();
6253+
if (!valid_filetype(*varp))
6254+
errmsg = e_invarg;
6255+
else
6256+
/* load or unload key mapping tables */
6257+
errmsg = keymap_init();
62406258

62416259
if (errmsg == NULL)
62426260
{
@@ -7222,6 +7240,22 @@ did_set_string_option(
72227240
}
72237241
#endif
72247242

7243+
#ifdef FEAT_AUTOCMD
7244+
else if (gvarp == &p_ft)
7245+
{
7246+
if (!valid_filetype(*varp))
7247+
errmsg = e_invarg;
7248+
}
7249+
#endif
7250+
7251+
#ifdef FEAT_SYN_HL
7252+
else if (gvarp == &p_syn)
7253+
{
7254+
if (!valid_filetype(*varp))
7255+
errmsg = e_invarg;
7256+
}
7257+
#endif
7258+
72257259
/* Options that are a list of flags. */
72267260
else
72277261
{

Diff for: src/testdir/test_options.vim

+49
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,52 @@ func Test_signcolumn()
4848
endif
4949
endfunc
5050

51+
func Test_filetype_valid()
52+
set ft=valid_name
53+
call assert_equal("valid_name", &filetype)
54+
set ft=valid-name
55+
call assert_equal("valid-name", &filetype)
56+
57+
call assert_fails(":set ft=wrong;name", "E474:")
58+
call assert_fails(":set ft=wrong\\\\name", "E474:")
59+
call assert_fails(":set ft=wrong\\|name", "E474:")
60+
call assert_fails(":set ft=wrong/name", "E474:")
61+
call assert_fails(":set ft=wrong\\\nname", "E474:")
62+
call assert_equal("valid-name", &filetype)
63+
64+
exe "set ft=trunc\x00name"
65+
call assert_equal("trunc", &filetype)
66+
endfunc
67+
68+
func Test_syntax_valid()
69+
set syn=valid_name
70+
call assert_equal("valid_name", &syntax)
71+
set syn=valid-name
72+
call assert_equal("valid-name", &syntax)
73+
74+
call assert_fails(":set syn=wrong;name", "E474:")
75+
call assert_fails(":set syn=wrong\\\\name", "E474:")
76+
call assert_fails(":set syn=wrong\\|name", "E474:")
77+
call assert_fails(":set syn=wrong/name", "E474:")
78+
call assert_fails(":set syn=wrong\\\nname", "E474:")
79+
call assert_equal("valid-name", &syntax)
80+
81+
exe "set syn=trunc\x00name"
82+
call assert_equal("trunc", &syntax)
83+
endfunc
84+
85+
func Test_keymap_valid()
86+
call assert_fails(":set kmp=valid_name", "E544:")
87+
call assert_fails(":set kmp=valid_name", "valid_name")
88+
call assert_fails(":set kmp=valid-name", "E544:")
89+
call assert_fails(":set kmp=valid-name", "valid-name")
90+
91+
call assert_fails(":set kmp=wrong;name", "E474:")
92+
call assert_fails(":set kmp=wrong\\\\name", "E474:")
93+
call assert_fails(":set kmp=wrong\\|name", "E474:")
94+
call assert_fails(":set kmp=wrong/name", "E474:")
95+
call assert_fails(":set kmp=wrong\\\nname", "E474:")
96+
97+
call assert_fails(":set kmp=trunc\x00name", "E544:")
98+
call assert_fails(":set kmp=trunc\x00name", "trunc")
99+
endfunc

Diff for: src/version.c

+2
Original file line numberDiff line numberDiff line change
@@ -764,6 +764,8 @@ static char *(features[]) =
764764

765765
static int included_patches[] =
766766
{ /* Add new patch number below this line */
767+
/**/
768+
56,
767769
/**/
768770
55,
769771
/**/

0 commit comments

Comments
 (0)