# HG changeset patch # User Christian Brabandt # Date 1700768704 -3600 # Node ID 4550abd680b6e54da30ca80396421f64075ebe5a # Parent 2948c0b4f0877de546c52cc21a14b0070c80da23 patch 9.0.2124: INT overflow detection logic can be simplified Commit: https://github.com/vim/vim/commit/2b0882fa6555b4d0197afbdfc32a4533cf6aacf4 Author: Ernie Rael Date: Thu Nov 23 20:21:45 2023 +0100 patch 9.0.2124: INT overflow detection logic can be simplified Problem: INT overflow logic can be simplified Solution: introduce trim_to_int() function closes: #13556 Signed-off-by: Ernie Rael Signed-off-by: Christian Brabandt diff --git a/src/cindent.c b/src/cindent.c --- a/src/cindent.c +++ b/src/cindent.c @@ -1734,7 +1734,7 @@ parse_cino(buf_T *buf) int divider; int fraction = 0; int sw; - long long t = get_sw_value(buf); + long t = get_sw_value(buf); // needed for cino-(, it will be multiplied by 2 again if (t > INT_MAX / 2) @@ -1902,17 +1902,14 @@ parse_cino(buf_T *buf) { n *= sw; if (divider) - n += (sw * fraction + divider / 2) / divider; + n += ((long long)sw * fraction + divider / 2) / divider; } ++p; } if (l[1] == '-') n = -n; - if (n > INT_MAX) - n = INT_MAX; - else if (n < INT_MIN) - n = INT_MIN; + n = trim_to_int(n); // When adding an entry here, also update the default 'cinoptions' in // doc/indent.txt, and add explanation for it! diff --git a/src/misc1.c b/src/misc1.c --- a/src/misc1.c +++ b/src/misc1.c @@ -2838,3 +2838,11 @@ vim_append_digit_long(long *value, int d *value = x * 10 + (long)digit; return OK; } + +// Return something that fits into an int. + int +trim_to_int(long long x) +{ + return x > INT_MAX ? INT_MAX : x < INT_MIN ? INT_MIN : x; +} + diff --git a/src/ops.c b/src/ops.c --- a/src/ops.c +++ b/src/ops.c @@ -230,8 +230,8 @@ shift_line( int call_changed_bytes) // call changed_bytes() { long long count; - long i, j; - long sw_val = get_sw_value_indent(curbuf); + int i, j; + int sw_val = trim_to_int(get_sw_value_indent(curbuf)); count = (long long)get_indent(); // get current indent @@ -263,14 +263,11 @@ shift_line( count += (long long)sw_val * (long long)amount; } - if (count > INT_MAX) - count = INT_MAX; - // Set new indent if (State & VREPLACE_FLAG) - change_indent(INDENT_SET, (int)count, FALSE, NUL, call_changed_bytes); + change_indent(INDENT_SET, trim_to_int(count), FALSE, NUL, call_changed_bytes); else - (void)set_indent((int)count, call_changed_bytes ? SIN_CHANGED : 0); + (void)set_indent(trim_to_int(count), call_changed_bytes ? SIN_CHANGED : 0); } /* diff --git a/src/proto/misc1.pro b/src/proto/misc1.pro --- a/src/proto/misc1.pro +++ b/src/proto/misc1.pro @@ -55,4 +55,5 @@ void restore_v_event(dict_T *v_event, sa void may_trigger_modechanged(void); int vim_append_digit_int(int *value, int digit); int vim_append_digit_long(long *value, int digit); +int trim_to_int(long long x); /* vim: set ft=c : */ diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -705,6 +705,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2124, +/**/ 2123, /**/ 2122,