diff --git a/src/ops.c b/src/ops.c index c0a2981d68..ecd7fc2170 100644 --- a/src/ops.c +++ b/src/ops.c @@ -229,11 +229,11 @@ shift_line( int amount, int call_changed_bytes) // call changed_bytes() { - int count; + long long count; int i, j; int sw_val = (int)get_sw_value_indent(curbuf); - count = get_indent(); // get current indent + count = (long long)get_indent(); // get current indent if (round) // round off indent { @@ -260,14 +260,19 @@ shift_line( count = 0; } else - count += sw_val * amount; + { + if ((long long)sw_val * (long long)amount > INT_MAX - count) + count = INT_MAX; + else + count += (long long)sw_val * (long long)amount; + } } // Set new indent if (State & VREPLACE_FLAG) - change_indent(INDENT_SET, count, FALSE, NUL, call_changed_bytes); + change_indent(INDENT_SET, (int)count, FALSE, NUL, call_changed_bytes); else - (void)set_indent(count, call_changed_bytes ? SIN_CHANGED : 0); + (void)set_indent((int)count, call_changed_bytes ? SIN_CHANGED : 0); } /* diff --git a/src/testdir/test_indent.vim b/src/testdir/test_indent.vim index 96e9d23008..217a7ae625 100644 --- a/src/testdir/test_indent.vim +++ b/src/testdir/test_indent.vim @@ -275,4 +275,15 @@ func Test_formatting_keeps_first_line_indent() bwipe! endfunc +" Test for indenting with large amount, causes overflow +func Test_indent_overflow_count() + new + setl sw=8 + call setline(1, "abc") + norm! V2147483647> + " indents by INT_MAX + call assert_equal(2147483647, indent(1)) + close! +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 66aff800bd..249cd11d20 100644 --- a/src/version.c +++ b/src/version.c @@ -704,6 +704,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 2112, /**/ 2111, /**/