diff options
author | ZyX <kp-pav@yandex.ru> | 2016-02-11 01:29:09 +0300 |
---|---|---|
committer | ZyX <kp-pav@yandex.ru> | 2016-04-18 02:47:13 +0300 |
commit | f0bd4a149408e75ebf887530964e0948518938dc (patch) | |
tree | 06c489c6a8b506a122a0d93448c7bc9418dd8b5b /src/nvim/message.c | |
parent | 77776b09c684bc2a0c42114fce5a8b04409ec91d (diff) | |
download | rneovim-f0bd4a149408e75ebf887530964e0948518938dc.tar.gz rneovim-f0bd4a149408e75ebf887530964e0948518938dc.tar.bz2 rneovim-f0bd4a149408e75ebf887530964e0948518938dc.zip |
eval/encode: Fix invalid UTF-8 strings handling:
1. Do not allow reading past buffer end when creating error messages.
2. Fix surrogate pairs range, avoid magic constants.
Diffstat (limited to 'src/nvim/message.c')
-rw-r--r-- | src/nvim/message.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/src/nvim/message.c b/src/nvim/message.c index 1dd71baaa4..c4207fbe9e 100644 --- a/src/nvim/message.c +++ b/src/nvim/message.c @@ -609,6 +609,21 @@ int emsgu(char_u *s, uint64_t n) return emsg(IObuff); } +/// Print an error message with unknown number of arguments +bool emsgf(const char *const fmt, ...) +{ + if (emsg_not_now()) { + return true; + } + + va_list ap; + va_start(ap, fmt); + vim_vsnprintf((char *) IObuff, IOSIZE, fmt, ap, NULL); + va_end(ap); + + return emsg(IObuff); +} + /* * Like msg(), but truncate to a single line if p_shm contains 't', or when * "force" is TRUE. This truncates in another way as for normal messages. @@ -3097,11 +3112,12 @@ int vim_snprintf(char *str, size_t str_m, char *fmt, ...) return str_l; } -int vim_vsnprintf(char *str, size_t str_m, char *fmt, va_list ap, typval_T *tvs) +int vim_vsnprintf(char *str, size_t str_m, const char *fmt, va_list ap, + typval_T *tvs) { size_t str_l = 0; bool str_avail = str_l < str_m; - char *p = fmt; + const char *p = fmt; int arg_idx = 1; if (!p) { @@ -3135,7 +3151,7 @@ int vim_vsnprintf(char *str, size_t str_m, char *fmt, va_list ap, typval_T *tvs) char tmp[TMP_LEN]; // string address in case of string argument - char *str_arg; + const char *str_arg; // natural field width of arg without padding and sign size_t str_arg_l; |