Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(diff): handle long lines without crashing #21389

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
fix(diff): handle long lines without crashing
Bump the max line length from 500 -> 800 while we're at it.

Fixes #21388
  • Loading branch information
lewis6991 committed Dec 12, 2022
commit 6cbc6d79e6be6ca7cf0f282b7726fe994c97ebcb
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)