fix(mouse): copy the line before syntax matching (#24320)

This commit is contained in:
zeertzjq 2023-07-12 08:50:34 +08:00 committed by GitHub
parent bf5703042b
commit bf52fb7193
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 14 additions and 10 deletions

View File

@ -1692,7 +1692,8 @@ static int mouse_adjust_click(win_T *wp, int row, int col)
// highlighting the second byte, not the ninth.
linenr_T lnum = wp->w_cursor.lnum;
char *line = ml_get(lnum);
// Make a copy of the line, because syntax matching may free it.
char *line = xstrdup(ml_get(lnum));
char *ptr = line;
char *ptr_end;
char *ptr_row_offset = line; // Where we begin adjusting `ptr_end`
@ -1733,8 +1734,8 @@ static int mouse_adjust_click(win_T *wp, int row, int col)
vcol = offset;
#define INCR() nudge++; ptr_end += utfc_ptr2len((char *)ptr_end)
#define DECR() nudge--; ptr_end -= utfc_ptr2len((char *)ptr_end)
#define INCR() nudge++; ptr_end += utfc_ptr2len(ptr_end)
#define DECR() nudge--; ptr_end -= utfc_ptr2len(ptr_end)
while (ptr < ptr_end && *ptr != NUL) {
int cwidth = win_chartabsize(curwin, ptr, vcol);
@ -1776,6 +1777,7 @@ static int mouse_adjust_click(win_T *wp, int row, int col)
ptr += utfc_ptr2len(ptr);
}
xfree(line);
return col + nudge;
}

View File

@ -1024,13 +1024,15 @@ describe('ui/mouse/input', function()
})
feed('ggdG')
feed_command('set concealcursor=ni')
feed_command('set nowrap')
feed_command('set shiftwidth=2 tabstop=4 list')
feed_command('setl listchars=tab:>-')
feed_command('syntax match NonText "\\*" conceal')
feed_command('syntax match NonText "cats" conceal cchar=X')
feed_command('syntax match NonText "x" conceal cchar=>')
command([[setlocal concealcursor=ni nowrap shiftwidth=2 tabstop=4 list listchars=tab:>-]])
command([[syntax region X0 matchgroup=X1 start=/\*/ end=/\*/ concealends contains=X2]])
command([[syntax match X2 /cats/ conceal cchar=X contained]])
-- No heap-use-after-free with multi-line syntax pattern #24317
command([[syntax match X3 /\n\@<=x/ conceal cchar=>]])
command([[highlight link X0 Normal]])
command([[highlight link X1 NonText]])
command([[highlight link X2 NonText]])
command([[highlight link X3 NonText]])
-- First column is there to retain the tabs.
insert([[