summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorErnie Rael <errael@raelity.com>2023-11-23 20:21:45 +0100
committerChristian Brabandt <cb@256bit.org>2023-11-23 20:33:05 +0100
commit2b0882fa6555b4d0197afbdfc32a4533cf6aacf4 (patch)
treeb8467231938c30e9391beb2f363f2a82fe872cb3 /src
parentdf63da98d8dc284b1c76cfe1b17fa0acbd6094d8 (diff)
patch 9.0.2124: INT overflow detection logic can be simplifiedv9.0.2124
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>
Diffstat (limited to 'src')
-rw-r--r--src/cindent.c9
-rw-r--r--src/misc1.c8
-rw-r--r--src/ops.c11
-rw-r--r--src/proto/misc1.pro1
-rw-r--r--src/version.c2
5 files changed, 18 insertions, 13 deletions
diff --git a/src/cindent.c b/src/cindent.c
index 7ac1f4ba87..a9b813f6d8 100644
--- 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
index dc0deae67a..a82ef9cd93 100644
--- a/src/misc1.c
+++ b/src/misc1.c
@@ -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;
+}
+
diff --git a/src/ops.c b/src/ops.c
index 7cb82b89fb..e30fea7e06 100644
--- 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
index 2b8e9d8f26..c602b0ebeb 100644
--- a/src/proto/misc1.pro
+++ b/src/proto/misc1.pro
@@ -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 : */
diff --git a/src/version.c b/src/version.c
index 1bbaac348c..fc3389888e 100644
--- 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,