Mercurial > vim
diff src/option.c @ 16277:5ef25fa57f71 v8.1.1143
patch 8.1.1143: may pass weird strings to file name expansion
commit https://github.com/vim/vim/commit/8f130eda4747e4a4d68353cdb650f359fd01469b
Author: Bram Moolenaar <Bram@vim.org>
Date: Wed Apr 10 22:15:19 2019 +0200
patch 8.1.1143: may pass weird strings to file name expansion
Problem: May pass weird strings to file name expansion.
Solution: Check for matching characters. Disallow control characters.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Wed, 10 Apr 2019 22:30:06 +0200 |
parents | abb67309c1ca |
children | 36d97f2a4c2b |
line wrap: on
line diff
--- a/src/option.c +++ b/src/option.c @@ -6006,18 +6006,37 @@ set_string_option( } /* + * Return TRUE if "val" is a valid name: only consists of alphanumeric ASCII + * characters or characters in "allowed". + */ + static int +valid_name(char_u *val, char *allowed) +{ + char_u *s; + + for (s = val; *s != NUL; ++s) + 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) { - char_u *s; - - for (s = val; *s != NUL; ++s) - if (!ASCII_ISALNUM(*s) && vim_strchr((char_u *)".-_", *s) == NULL) - return FALSE; - return TRUE; + return valid_name(val, ".-_"); +} + +/* + * Return TRUE if "val" is a valid 'spellang' value. + */ + int +valid_spellang(char_u *val) +{ + return valid_name(val, ".-_,"); } /* @@ -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); } }