changeset 33817:4550abd680b6 v9.0.2124

patch 9.0.2124: INT overflow detection logic can be simplified Commit: https://github.com/vim/vim/commit/2b0882fa6555b4d0197afbdfc32a4533cf6aacf4 Author: Ernie Rael <errael@raelity.com> 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 <errael@raelity.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
author Christian Brabandt <cb@256bit.org>
date Thu, 23 Nov 2023 20:45:04 +0100
parents 2948c0b4f087
children de9eb7b493c9
files src/cindent.c src/misc1.c src/ops.c src/proto/misc1.pro src/version.c
diffstat 5 files changed, 18 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- 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!
--- 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;
+}
+
--- 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);
 }
 
 /*
--- 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 : */
--- 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,