]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.0.2124: INT overflow detection logic can be simplified v9.0.2124
authorErnie Rael <errael@raelity.com>
Thu, 23 Nov 2023 19:21:45 +0000 (20:21 +0100)
committerChristian Brabandt <cb@256bit.org>
Thu, 23 Nov 2023 19:33:05 +0000 (20:33 +0100)
Problem:  INT overflow logic can be simplified
Solution: introduce trim_to_int() function

closes: #13556

Signed-off-by: Ernie Rael <errael@raelity.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
src/cindent.c
src/misc1.c
src/ops.c
src/proto/misc1.pro
src/version.c

index 7ac1f4ba8752a8688d0811161750cf7c375ff00d..a9b813f6d80ce46f44b00b17e52cebfaf23114af 100644 (file)
@@ -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!
index dc0deae67af935970cc65b76ad77cd7f5d3bc2a1..a82ef9cd93d594c4bbf19437b7fe0a1afdcff86e 100644 (file)
@@ -2838,3 +2838,11 @@ vim_append_digit_long(long *value, int digit)
     *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;
+}
+
index 7cb82b89fb796913144b2723c9d5a0694b6f38ce..e30fea7e063ac8cb6713754ea4fa270d2bd5fc15 100644 (file)
--- 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);
 }
 
 /*
index 2b8e9d8f264cbb8a28a8e83b8673d6509c3e4313..c602b0ebeb84eca16440210ca30a013a597d8483 100644 (file)
@@ -55,4 +55,5 @@ void restore_v_event(dict_T *v_event, save_v_event_T *sve);
 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 : */
index 1bbaac348cf30b1acb1503c2c73bedf9c3cd5a6e..fc3389888e41f881c3b7bcf0cf98ac9899bdd6f5 100644 (file)
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2124,
 /**/
     2123,
 /**/