diff options
-rw-r--r-- | src/nvim/ops.c | 16 | ||||
-rw-r--r-- | test/old/testdir/test_indent.vim | 12 |
2 files changed, 22 insertions, 6 deletions
diff --git a/src/nvim/ops.c b/src/nvim/ops.c index 63c78936ba..1bba1154f2 100644 --- a/src/nvim/ops.c +++ b/src/nvim/ops.c @@ -283,11 +283,11 @@ void shift_line(bool left, bool round, int amount, int call_changed_bytes) if (sw_val == 0) { sw_val = 1; // shouldn't happen, just in case } - int count = get_indent(); // get current indent + int64_t count = get_indent(); // get current indent if (round) { // round off indent - int i = count / sw_val; // number of 'shiftwidth' rounded down - int j = count % sw_val; // extra spaces + int i = (int)(count / sw_val); // number of 'shiftwidth' rounded down + int j = (int)(count % sw_val); // extra spaces if (j && left) { // first remove extra spaces amount--; } @@ -301,15 +301,19 @@ void shift_line(bool left, bool round, int amount, int call_changed_bytes) if (left) { count = MAX(count - sw_val * amount, 0); } else { - count += sw_val * amount; + if ((int64_t)sw_val * (int64_t)amount > INT_MAX - count) { + count = INT_MAX; + } else { + count += (int64_t)sw_val * (int64_t)amount; + } } } // Set new indent if (State & VREPLACE_FLAG) { - change_indent(INDENT_SET, count, false, call_changed_bytes); + change_indent(INDENT_SET, (int)count, false, call_changed_bytes); } else { - set_indent(count, call_changed_bytes ? SIN_CHANGED : 0); + set_indent((int)count, call_changed_bytes ? SIN_CHANGED : 0); } } diff --git a/test/old/testdir/test_indent.vim b/test/old/testdir/test_indent.vim index dcacc11663..6afc3ff405 100644 --- a/test/old/testdir/test_indent.vim +++ b/test/old/testdir/test_indent.vim @@ -276,4 +276,16 @@ func Test_formatting_keeps_first_line_indent() bwipe! endfunc +" Test for indenting with large amount, causes overflow +func Test_indent_overflow_count() + throw 'skipped: TODO: ' + 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 |