diff options
-rw-r--r-- | src/misc1.c | 15 | ||||
-rw-r--r-- | src/option.c | 35 | ||||
-rw-r--r-- | src/proto/option.pro | 1 | ||||
-rw-r--r-- | src/spell.c | 5 | ||||
-rw-r--r-- | src/testdir/test_escaped_glob.vim | 2 | ||||
-rw-r--r-- | src/testdir/test_spell.vim | 6 | ||||
-rw-r--r-- | src/version.c | 2 |
7 files changed, 56 insertions, 10 deletions
diff --git a/src/misc1.c b/src/misc1.c index 54da8900e..379709475 100644 --- a/src/misc1.c +++ b/src/misc1.c @@ -6170,11 +6170,22 @@ has_special_wildchar(char_u *p) { for ( ; *p; MB_PTR_ADV(p)) { - /* Allow for escaping. */ - if (*p == '\\' && p[1] != NUL) + // Disallow line break characters. + if (*p == '\r' || *p == '\n') + break; + // Allow for escaping. + if (*p == '\\' && p[1] != NUL && p[1] != '\r' && p[1] != '\n') ++p; else if (vim_strchr((char_u *)SPECIAL_WILDCHAR, *p) != NULL) + { + // A { must be followed by a matching }. + if (*p == '{' && vim_strchr(p, '}') == NULL) + continue; + // A quote and backtick must be followed by another one. + if ((*p == '`' || *p == '\'') && vim_strchr(p, *p) == NULL) + continue; return TRUE; + } } return FALSE; } diff --git a/src/option.c b/src/option.c index 456439581..e4b1d5f43 100644 --- a/src/option.c +++ b/src/option.c @@ -6006,21 +6006,40 @@ set_string_option( } /* - * Return TRUE if "val" is a valid 'filetype' name. - * Also used for 'syntax' and 'keymap'. + * Return TRUE if "val" is a valid name: only consists of alphanumeric ASCII + * characters or characters in "allowed". */ static int -valid_filetype(char_u *val) +valid_name(char_u *val, char *allowed) { char_u *s; for (s = val; *s != NUL; ++s) - if (!ASCII_ISALNUM(*s) && vim_strchr((char_u *)".-_", *s) == NULL) + if (!ASCII_ISALNUM(*s) && vim_strchr((char_u *)allowed, *s) == NULL) return FALSE; return TRUE; } /* + * Return TRUE if "val" is a valid 'filetype' name. + * Also used for 'syntax' and 'keymap'. + */ + static int +valid_filetype(char_u *val) +{ + return valid_name(val, ".-_"); +} + +/* + * Return TRUE if "val" is a valid 'spellang' value. + */ + int +valid_spellang(char_u *val) +{ + return valid_name(val, ".-_,"); +} + +/* * Handle string options that need some action to perform when changed. * Returns NULL for success, or an error message for an error. */ @@ -7082,7 +7101,10 @@ did_set_string_option( else if (varp == &(curwin->w_s->b_p_spl) || varp == &(curwin->w_s->b_p_spf)) { - errmsg = did_set_spell_option(varp == &(curwin->w_s->b_p_spf)); + if (!valid_spellang(*varp)) + errmsg = e_invarg; + else + errmsg = did_set_spell_option(varp == &(curwin->w_s->b_p_spf)); } /* When 'spellcapcheck' is set compile the regexp program. */ else if (varp == &(curwin->w_s->b_p_spc)) @@ -7737,7 +7759,8 @@ did_set_string_option( break; if (p > q) { - vim_snprintf((char *)fname, 200, "spell/%.*s.vim", (int)(p - q), q); + vim_snprintf((char *)fname, 200, "spell/%.*s.vim", + (int)(p - q), q); source_runtime(fname, DIP_ALL); } } diff --git a/src/proto/option.pro b/src/proto/option.pro index 1027edf68..15aa0102e 100644 --- a/src/proto/option.pro +++ b/src/proto/option.pro @@ -21,6 +21,7 @@ int get_term_opt_idx(char_u **p); int set_term_option_alloced(char_u **p); int was_set_insecurely(char_u *opt, int opt_flags); void set_string_option_direct(char_u *name, int opt_idx, char_u *val, int opt_flags, int set_sid); +int valid_spellang(char_u *val); char *check_colorcolumn(win_T *wp); char *check_stl_option(char_u *s); void set_term_option_sctx_idx(char *name, int opt_idx); diff --git a/src/spell.c b/src/spell.c index ae4db12c0..947bee518 100644 --- a/src/spell.c +++ b/src/spell.c @@ -2308,11 +2308,14 @@ did_set_spelllang(win_T *wp) /* Loop over comma separated language names. */ for (splp = spl_copy; *splp != NUL; ) { - /* Get one language name. */ + // Get one language name. copy_option_part(&splp, lang, MAXWLEN, ","); region = NULL; len = (int)STRLEN(lang); + if (!valid_spellang(lang)) + continue; + if (STRCMP(lang, "cjk") == 0) { wp->w_s->b_cjk = 1; diff --git a/src/testdir/test_escaped_glob.vim b/src/testdir/test_escaped_glob.vim index 880f32eca..a03c18047 100644 --- a/src/testdir/test_escaped_glob.vim +++ b/src/testdir/test_escaped_glob.vim @@ -17,7 +17,7 @@ function Test_glob() " Setting 'shell' to an invalid name causes a memory leak. sandbox call assert_equal("", glob('Xxx\{')) sandbox call assert_equal("", glob('Xxx\$')) - w! Xxx{ + w! Xxx\{ w! Xxx\$ sandbox call assert_equal("Xxx{", glob('Xxx\{')) sandbox call assert_equal("Xxx$", glob('Xxx\$')) diff --git a/src/testdir/test_spell.vim b/src/testdir/test_spell.vim index 76ad12e4c..6bf43ac3f 100644 --- a/src/testdir/test_spell.vim +++ b/src/testdir/test_spell.vim @@ -149,6 +149,12 @@ func Test_spellinfo() set nospell spelllang=en call assert_fails('spellinfo', 'E756:') + call assert_fails('set spelllang=foo/bar', 'E474:') + call assert_fails('set spelllang=foo\ bar', 'E474:') + call assert_fails("set spelllang=foo\\\nbar", 'E474:') + call assert_fails("set spelllang=foo\\\rbar", 'E474:') + call assert_fails("set spelllang=foo+bar", 'E474:') + set enc& spell& spelllang& bwipe endfunc diff --git a/src/version.c b/src/version.c index a9e4ccf74..3e0e95f41 100644 --- a/src/version.c +++ b/src/version.c @@ -772,6 +772,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1143, +/**/ 1142, /**/ 1141, |