Skip to content

Commit

Permalink
fix(diff): handle long lines without crashing (#21389)
Browse files Browse the repository at this point in the history
Fixes #21388
  • Loading branch information
lewis6991 committed Dec 12, 2022
1 parent 49c240d commit d40d34a
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 9 deletions.
6 changes: 3 additions & 3 deletions src/nvim/linematch.c
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ static void update_path_flat(diffcmppath_T *diffcmppath, int score, size_t to, s
diffcmppath[to].df_path_idx = path_idx + 1;
}

#define MATCH_CHAR_MAX_LEN 500
#define MATCH_CHAR_MAX_LEN 800

/// Return matching characters between "s1" and "s2" whilst respecting sequence order.
/// Consider the case of two strings 'AAACCC' and 'CCCAAA', the
Expand All @@ -102,8 +102,8 @@ static void update_path_flat(diffcmppath_T *diffcmppath, int score, size_t to, s
/// @param s2
static int matching_chars(const char *s1, const char *s2)
{
size_t s1len = MIN(MATCH_CHAR_MAX_LEN, line_len(s1));
size_t s2len = MIN(MATCH_CHAR_MAX_LEN, line_len(s2));
size_t s1len = MIN(MATCH_CHAR_MAX_LEN - 1, line_len(s1));
size_t s2len = MIN(MATCH_CHAR_MAX_LEN - 1, line_len(s2));
int matrix[2][MATCH_CHAR_MAX_LEN] = { 0 };
bool icur = 1; // save space by storing only two rows for i axis
for (size_t i = 0; i < s1len; i++) {
Expand Down
26 changes: 20 additions & 6 deletions test/functional/ui/linematch_spec.lua
Original file line number Diff line number Diff line change
Expand Up @@ -49,12 +49,11 @@ describe('Diff mode screen with 3 diffs open', function()
[8] = {background = Screen.colors.Red1, bold = true};
[10] = {foreground = Screen.colors.Brown};
[9] = {background = Screen.colors.Plum1};
})
})
feed('<c-w>=')
feed(':windo set nu!<cr>')


end)

describe('setup the diff screen to look like a merge conflict with 3 files in diff mode', function()
before_each(function()

Expand Down Expand Up @@ -249,12 +248,11 @@ describe('Diff mode screen with 2 diffs open', function()
[8] = {background = Screen.colors.Red1, bold = true};
[10] = {foreground = Screen.colors.Brown};
[9] = {background = Screen.colors.Plum1};
})
})
feed('<c-w>=')
feed(':windo set nu!<cr>')


end)

describe('setup a diff with 2 files and set linematch:30', function()
before_each(function()
feed(':set diffopt+=linematch:30<cr>')
Expand Down Expand Up @@ -979,3 +977,19 @@ something
end)
end)
end)

describe('regressions', function()
local screen

it("doesn't crash with long lines", function()
clear()
feed(':set diffopt+=linematch:30<cr>')
screen = Screen.new(100, 20)
screen:attach()
-- line must be greater than MATCH_CHAR_MAX_LEN
helpers.curbufmeths.set_lines(0, -1, false, { string.rep('a', 1000)..'hello' })
helpers.exec 'vnew'
helpers.curbufmeths.set_lines(0, -1, false, { string.rep('a', 1010)..'world' })
helpers.exec 'windo diffthis'
end)
end)

0 comments on commit d40d34a

Please sign in to comment.