mirror of
https://github.com/neovim/neovim.git
synced 2025-09-06 11:28:22 +00:00
vim-patch:9.1.0638: E1510 may happen when formatting a message for smsg() (#29907)
Problem: E1510 may happen when formatting a message
(after 9.1.0181).
Solution: Only give E1510 when using typval. (zeertzjq)
closes: vim/vim#15391
0dff31576a
This commit is contained in:
@@ -1005,7 +1005,7 @@ static void format_overflow_error(const char *pstart)
|
|||||||
|
|
||||||
enum { MAX_ALLOWED_STRING_WIDTH = 6400, };
|
enum { MAX_ALLOWED_STRING_WIDTH = 6400, };
|
||||||
|
|
||||||
static int get_unsigned_int(const char *pstart, const char **p, unsigned *uj)
|
static int get_unsigned_int(const char *pstart, const char **p, unsigned *uj, bool overflow_err)
|
||||||
{
|
{
|
||||||
*uj = (unsigned)(**p - '0');
|
*uj = (unsigned)(**p - '0');
|
||||||
(*p)++;
|
(*p)++;
|
||||||
@@ -1016,8 +1016,12 @@ static int get_unsigned_int(const char *pstart, const char **p, unsigned *uj)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (*uj > MAX_ALLOWED_STRING_WIDTH) {
|
if (*uj > MAX_ALLOWED_STRING_WIDTH) {
|
||||||
|
if (overflow_err) {
|
||||||
format_overflow_error(pstart);
|
format_overflow_error(pstart);
|
||||||
return FAIL;
|
return FAIL;
|
||||||
|
} else {
|
||||||
|
*uj = MAX_ALLOWED_STRING_WIDTH;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
@@ -1078,7 +1082,7 @@ static int parse_fmt_types(const char ***ap_types, int *num_posarg, const char *
|
|||||||
// Positional argument
|
// Positional argument
|
||||||
unsigned uj;
|
unsigned uj;
|
||||||
|
|
||||||
if (get_unsigned_int(pstart, &p, &uj) == FAIL) {
|
if (get_unsigned_int(pstart, &p, &uj, tvs != NULL) == FAIL) {
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1121,7 +1125,7 @@ static int parse_fmt_types(const char ***ap_types, int *num_posarg, const char *
|
|||||||
// Positional argument field width
|
// Positional argument field width
|
||||||
unsigned uj;
|
unsigned uj;
|
||||||
|
|
||||||
if (get_unsigned_int(arg + 1, &p, &uj) == FAIL) {
|
if (get_unsigned_int(arg + 1, &p, &uj, tvs != NULL) == FAIL) {
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1147,7 +1151,7 @@ static int parse_fmt_types(const char ***ap_types, int *num_posarg, const char *
|
|||||||
const char *digstart = p;
|
const char *digstart = p;
|
||||||
unsigned uj;
|
unsigned uj;
|
||||||
|
|
||||||
if (get_unsigned_int(digstart, &p, &uj) == FAIL) {
|
if (get_unsigned_int(digstart, &p, &uj, tvs != NULL) == FAIL) {
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1168,7 +1172,7 @@ static int parse_fmt_types(const char ***ap_types, int *num_posarg, const char *
|
|||||||
// Parse precision
|
// Parse precision
|
||||||
unsigned uj;
|
unsigned uj;
|
||||||
|
|
||||||
if (get_unsigned_int(arg + 1, &p, &uj) == FAIL) {
|
if (get_unsigned_int(arg + 1, &p, &uj, tvs != NULL) == FAIL) {
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1195,7 +1199,7 @@ static int parse_fmt_types(const char ***ap_types, int *num_posarg, const char *
|
|||||||
const char *digstart = p;
|
const char *digstart = p;
|
||||||
unsigned uj;
|
unsigned uj;
|
||||||
|
|
||||||
if (get_unsigned_int(digstart, &p, &uj) == FAIL) {
|
if (get_unsigned_int(digstart, &p, &uj, tvs != NULL) == FAIL) {
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1491,7 +1495,7 @@ int vim_vsnprintf_typval(char *str, size_t str_m, const char *fmt, va_list ap_st
|
|||||||
const char *digstart = p;
|
const char *digstart = p;
|
||||||
unsigned uj;
|
unsigned uj;
|
||||||
|
|
||||||
if (get_unsigned_int(digstart, &p, &uj) == FAIL) {
|
if (get_unsigned_int(digstart, &p, &uj, tvs != NULL) == FAIL) {
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1533,7 +1537,7 @@ int vim_vsnprintf_typval(char *str, size_t str_m, const char *fmt, va_list ap_st
|
|||||||
// Positional argument field width
|
// Positional argument field width
|
||||||
unsigned uj;
|
unsigned uj;
|
||||||
|
|
||||||
if (get_unsigned_int(digstart, &p, &uj) == FAIL) {
|
if (get_unsigned_int(digstart, &p, &uj, tvs != NULL) == FAIL) {
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1542,15 +1546,19 @@ int vim_vsnprintf_typval(char *str, size_t str_m, const char *fmt, va_list ap_st
|
|||||||
p++;
|
p++;
|
||||||
}
|
}
|
||||||
|
|
||||||
const int j = (tvs
|
int j = (tvs
|
||||||
? (int)tv_nr(tvs, &arg_idx)
|
? (int)tv_nr(tvs, &arg_idx)
|
||||||
: (skip_to_arg(ap_types, ap_start, &ap, &arg_idx,
|
: (skip_to_arg(ap_types, ap_start, &ap, &arg_idx,
|
||||||
&arg_cur, fmt),
|
&arg_cur, fmt),
|
||||||
va_arg(ap, int)));
|
va_arg(ap, int)));
|
||||||
|
|
||||||
if (j > MAX_ALLOWED_STRING_WIDTH) {
|
if (j > MAX_ALLOWED_STRING_WIDTH) {
|
||||||
|
if (tvs != NULL) {
|
||||||
format_overflow_error(digstart);
|
format_overflow_error(digstart);
|
||||||
goto error;
|
goto error;
|
||||||
|
} else {
|
||||||
|
j = MAX_ALLOWED_STRING_WIDTH;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (j >= 0) {
|
if (j >= 0) {
|
||||||
@@ -1565,12 +1573,7 @@ int vim_vsnprintf_typval(char *str, size_t str_m, const char *fmt, va_list ap_st
|
|||||||
const char *digstart = p;
|
const char *digstart = p;
|
||||||
unsigned uj;
|
unsigned uj;
|
||||||
|
|
||||||
if (get_unsigned_int(digstart, &p, &uj) == FAIL) {
|
if (get_unsigned_int(digstart, &p, &uj, tvs != NULL) == FAIL) {
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (uj > MAX_ALLOWED_STRING_WIDTH) {
|
|
||||||
format_overflow_error(digstart);
|
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1588,12 +1591,7 @@ int vim_vsnprintf_typval(char *str, size_t str_m, const char *fmt, va_list ap_st
|
|||||||
const char *digstart = p;
|
const char *digstart = p;
|
||||||
unsigned uj;
|
unsigned uj;
|
||||||
|
|
||||||
if (get_unsigned_int(digstart, &p, &uj) == FAIL) {
|
if (get_unsigned_int(digstart, &p, &uj, tvs != NULL) == FAIL) {
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (uj > MAX_ALLOWED_STRING_WIDTH) {
|
|
||||||
format_overflow_error(digstart);
|
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1607,7 +1605,7 @@ int vim_vsnprintf_typval(char *str, size_t str_m, const char *fmt, va_list ap_st
|
|||||||
// positional argument
|
// positional argument
|
||||||
unsigned uj;
|
unsigned uj;
|
||||||
|
|
||||||
if (get_unsigned_int(digstart, &p, &uj) == FAIL) {
|
if (get_unsigned_int(digstart, &p, &uj, tvs != NULL) == FAIL) {
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1616,15 +1614,19 @@ int vim_vsnprintf_typval(char *str, size_t str_m, const char *fmt, va_list ap_st
|
|||||||
p++;
|
p++;
|
||||||
}
|
}
|
||||||
|
|
||||||
const int j = (tvs
|
int j = (tvs
|
||||||
? (int)tv_nr(tvs, &arg_idx)
|
? (int)tv_nr(tvs, &arg_idx)
|
||||||
: (skip_to_arg(ap_types, ap_start, &ap, &arg_idx,
|
: (skip_to_arg(ap_types, ap_start, &ap, &arg_idx,
|
||||||
&arg_cur, fmt),
|
&arg_cur, fmt),
|
||||||
va_arg(ap, int)));
|
va_arg(ap, int)));
|
||||||
|
|
||||||
if (j > MAX_ALLOWED_STRING_WIDTH) {
|
if (j > MAX_ALLOWED_STRING_WIDTH) {
|
||||||
|
if (tvs != NULL) {
|
||||||
format_overflow_error(digstart);
|
format_overflow_error(digstart);
|
||||||
goto error;
|
goto error;
|
||||||
|
} else {
|
||||||
|
j = MAX_ALLOWED_STRING_WIDTH;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (j >= 0) {
|
if (j >= 0) {
|
||||||
|
@@ -846,6 +846,22 @@ func Test_spell_add_word()
|
|||||||
%bw!
|
%bw!
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Test_spell_add_long_word()
|
||||||
|
set spell spellfile=./Xspellfile.add spelllang=en
|
||||||
|
|
||||||
|
let word = repeat('a', 9000)
|
||||||
|
let v:errmsg = ''
|
||||||
|
" Spell checking doesn't really work for such a long word,
|
||||||
|
" but this should not cause an E1510 error.
|
||||||
|
exe 'spellgood ' .. word
|
||||||
|
call assert_equal('', v:errmsg)
|
||||||
|
call assert_equal([word], readfile('./Xspellfile.add'))
|
||||||
|
|
||||||
|
set spell& spellfile= spelllang& encoding=utf-8
|
||||||
|
call delete('./Xspellfile.add')
|
||||||
|
call delete('./Xspellfile.add.spl')
|
||||||
|
endfunc
|
||||||
|
|
||||||
func Test_spellfile_verbose()
|
func Test_spellfile_verbose()
|
||||||
call writefile(['1', 'one'], 'XtestVerbose.dic', 'D')
|
call writefile(['1', 'one'], 'XtestVerbose.dic', 'D')
|
||||||
call writefile([], 'XtestVerbose.aff', 'D')
|
call writefile([], 'XtestVerbose.aff', 'D')
|
||||||
|
Reference in New Issue
Block a user