patch 9.1.0813: no error handling with setglobal and number types
Problem: no error handling with setglobal and number types
Solution: validate values when using :setglobal with number option types
(Milly)
closes: #15928
Signed-off-by: Milly <milly.ca@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
diff --git a/src/option.c b/src/option.c
index e82a79b..f408fb9 100644
--- a/src/option.c
+++ b/src/option.c
@@ -3465,6 +3465,16 @@
errmsg = e_invalid_argument;
curwin->w_p_cole = 3;
}
+ if (curwin->w_allbuf_opt.wo_cole < 0)
+ {
+ errmsg = e_argument_must_be_positive;
+ curwin->w_allbuf_opt.wo_cole = 0;
+ }
+ else if (curwin->w_allbuf_opt.wo_cole > 3)
+ {
+ errmsg = e_invalid_argument;
+ curwin->w_allbuf_opt.wo_cole = 3;
+ }
return errmsg;
}
@@ -3530,6 +3540,16 @@
errmsg = e_invalid_argument;
curwin->w_p_fdc = 12;
}
+ if (curwin->w_allbuf_opt.wo_fdc < 0)
+ {
+ errmsg = e_argument_must_be_positive;
+ curwin->w_allbuf_opt.wo_fdc = 0;
+ }
+ else if (curwin->w_allbuf_opt.wo_fdc > 12)
+ {
+ errmsg = e_invalid_argument;
+ curwin->w_allbuf_opt.wo_fdc = 12;
+ }
return errmsg;
}
@@ -3856,11 +3876,21 @@
errmsg = e_argument_must_be_positive;
curwin->w_p_nuw = 1;
}
- if (curwin->w_p_nuw > 20)
+ else if (curwin->w_p_nuw > 20)
{
errmsg = e_invalid_argument;
curwin->w_p_nuw = 20;
}
+ if (curwin->w_allbuf_opt.wo_nuw < 1)
+ {
+ errmsg = e_argument_must_be_positive;
+ curwin->w_allbuf_opt.wo_nuw = 1;
+ }
+ else if (curwin->w_allbuf_opt.wo_nuw > 20)
+ {
+ errmsg = e_invalid_argument;
+ curwin->w_allbuf_opt.wo_nuw = 20;
+ }
curwin->w_nrwidth_line_count = 0; // trigger a redraw
return errmsg;
@@ -4141,6 +4171,27 @@
long *pp = (long *)args->os_varp;
char *errmsg = NULL;
+ if (curbuf->b_p_ts <= 0)
+ {
+ errmsg = e_argument_must_be_positive;
+ curbuf->b_p_ts = 8;
+ }
+ else if (curbuf->b_p_ts > TABSTOP_MAX)
+ {
+ errmsg = e_invalid_argument;
+ curbuf->b_p_ts = 8;
+ }
+ if (p_ts <= 0)
+ {
+ errmsg = e_argument_must_be_positive;
+ p_ts = 8;
+ }
+ else if (p_ts > TABSTOP_MAX)
+ {
+ errmsg = e_invalid_argument;
+ p_ts = 8;
+ }
+
if (curbuf->b_p_sw < 0)
{
errmsg = e_argument_must_be_positive;
@@ -4153,6 +4204,18 @@
curbuf->b_p_sw = curbuf->b_p_ts;
#endif
}
+ if (p_sw < 0)
+ {
+ errmsg = e_argument_must_be_positive;
+#ifdef FEAT_VARTABS
+ // Use the first 'vartabstop' value, or 'tabstop' if vts isn't in use.
+ p_sw = tabstop_count(curbuf->b_p_vts_array) > 0
+ ? tabstop_first(curbuf->b_p_vts_array)
+ : curbuf->b_p_ts;
+#else
+ p_sw = curbuf->b_p_ts;
+#endif
+ }
#ifdef FEAT_FOLDING
if (foldmethodIsIndent(curwin))
@@ -4342,6 +4405,11 @@
errmsg = e_argument_must_be_positive;
curbuf->b_p_tw = 0;
}
+ if (p_tw < 0)
+ {
+ errmsg = e_argument_must_be_positive;
+ p_tw = 0;
+ }
#ifdef FEAT_SYN_HL
{
win_T *wp;
@@ -4810,16 +4878,6 @@
p_window = Rows - 1;
}
- if (curbuf->b_p_ts <= 0)
- {
- errmsg = e_argument_must_be_positive;
- curbuf->b_p_ts = 8;
- }
- else if (curbuf->b_p_ts > TABSTOP_MAX)
- {
- errmsg = e_invalid_argument;
- curbuf->b_p_ts = 8;
- }
if (p_tm < 0)
{
errmsg = e_argument_must_be_positive;
@@ -4952,6 +5010,10 @@
need_mouse_correct = TRUE;
#endif
+ // May set global value for local option.
+ if ((opt_flags & (OPT_LOCAL | OPT_GLOBAL)) == 0)
+ *(long *)get_varp_scope(&(options[opt_idx]), OPT_GLOBAL) = value;
+
// Invoke the option specific callback function to validate and apply the
// new value.
if (options[opt_idx].opt_did_set_cb != NULL)
@@ -4971,10 +5033,6 @@
errmsg = check_num_option_bounds(pp, old_value, old_Rows, old_Columns,
errbuf, errbuflen, errmsg);
- // May set global value for local option.
- if ((opt_flags & (OPT_LOCAL | OPT_GLOBAL)) == 0)
- *(long *)get_varp_scope(&(options[opt_idx]), OPT_GLOBAL) = *pp;
-
options[opt_idx].flags |= P_WAS_SET;
#if defined(FEAT_EVAL)