diff options
author | Lewis Russell <lewis6991@gmail.com> | 2022-12-12 16:44:11 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-12-12 16:44:11 +0000 |
commit | d40d34aaa5720b67da629b4ca74674dfd4b9221c (patch) | |
tree | 43b0748c067492d1d357aa128b620a2709b8b0b4 | |
parent | 49c240d3a2a783f3b62954d3e9153dbd07eb5f46 (diff) | |
download | rneovim-d40d34aaa5720b67da629b4ca74674dfd4b9221c.tar.gz rneovim-d40d34aaa5720b67da629b4ca74674dfd4b9221c.tar.bz2 rneovim-d40d34aaa5720b67da629b4ca74674dfd4b9221c.zip |
fix(diff): handle long lines without crashing (#21389)
Fixes https://github.com/neovim/neovim/issues/21388
-rw-r--r-- | src/nvim/linematch.c | 6 | ||||
-rw-r--r-- | test/functional/ui/linematch_spec.lua | 26 |
2 files changed, 23 insertions, 9 deletions
diff --git a/src/nvim/linematch.c b/src/nvim/linematch.c index ebedda9b4d..629a31c913 100644 --- a/src/nvim/linematch.c +++ b/src/nvim/linematch.c @@ -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 @@ -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++) { diff --git a/test/functional/ui/linematch_spec.lua b/test/functional/ui/linematch_spec.lua index 5601908929..697677aa67 100644 --- a/test/functional/ui/linematch_spec.lua +++ b/test/functional/ui/linematch_spec.lua @@ -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() @@ -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>') @@ -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) |