Patch 9.0.0142
Problem: Crash when adding and removing virtual text. (Ben Jackson)
Solution: Check that the text of the text property still exists.
Files: src/charset.c
*** ../vim-9.0.0141/src/charset.c 2022-08-04 15:03:16.253142105 +0100
--- src/charset.c 2022-08-05 11:35:35.802544475 +0100
***************
*** 1129,1171 ****
# ifdef FEAT_PROP_POPUP
if (cts->cts_has_prop_with_text)
{
! int i;
! int col = (int)(s - line);
for (i = 0; i < cts->cts_text_prop_count; ++i)
{
textprop_T *tp = cts->cts_text_props + i;
if (tp->tp_id < 0
! && ((tp->tp_col - 1 >= col && tp->tp_col - 1 < col + size
! && -tp->tp_id <= wp->w_buffer->b_textprop_text.ga_len)
! || (tp->tp_col == MAXCOL && (s[0] == NUL || s[1] == NUL)
! && cts->cts_with_trailing)))
{
! char_u *p = ((char_u **)wp->w_buffer->b_textprop_text.ga_data)[
! -tp->tp_id - 1];
! int cells = vim_strsize(p);
! added = wp->w_width - (vcol + size) % wp->w_width;
! if (tp->tp_col == MAXCOL)
{
! int below = (tp->tp_flags & TP_FLAG_ALIGN_BELOW);
! int wrap = (tp->tp_flags & TP_FLAG_WRAP);
! int len = (int)STRLEN(p);
! int n_used = len;
! // Keep in sync with where textprop_size_after_trunc() is
! // called in win_line().
! if (!wrap)
! cells = textprop_size_after_trunc(wp,
below, added, p, &n_used);
! // right-aligned does not really matter here, same as
! // "after"
! if (below)
! cells += wp->w_width - (vcol + size) % wp->w_width;
}
- cts->cts_cur_text_width += cells;
- size += cells;
}
if (tp->tp_col - 1 > col)
break;
--- 1129,1177 ----
# ifdef FEAT_PROP_POPUP
if (cts->cts_has_prop_with_text)
{
! int i;
! int col = (int)(s - line);
! garray_T *gap = &wp->w_buffer->b_textprop_text;
for (i = 0; i < cts->cts_text_prop_count; ++i)
{
textprop_T *tp = cts->cts_text_props + i;
+ // Watch out for the text being deleted. "cts_text_props" is a
+ // copy, the text prop may actually have been removed from the line.
if (tp->tp_id < 0
! && ((tp->tp_col - 1 >= col && tp->tp_col - 1 < col + size)
! || (tp->tp_col == MAXCOL && (s[0] == NUL || s[1] == NUL)
! && cts->cts_with_trailing))
! && -tp->tp_id - 1 < gap->ga_len)
{
! char_u *p = ((char_u **)gap->ga_data)[-tp->tp_id - 1];
! if (p != NULL)
{
! int cells = vim_strsize(p);
! added = wp->w_width - (vcol + size) % wp->w_width;
! if (tp->tp_col == MAXCOL)
! {
! int below = (tp->tp_flags & TP_FLAG_ALIGN_BELOW);
! int wrap = (tp->tp_flags & TP_FLAG_WRAP);
! int len = (int)STRLEN(p);
! int n_used = len;
!
! // Keep in sync with where textprop_size_after_trunc()
! // is called in win_line().
! if (!wrap)
! cells = textprop_size_after_trunc(wp,
below, added, p, &n_used);
! // right-aligned does not really matter here, same as
! // "after"
! if (below)
! cells += wp->w_width - (vcol + size) % wp->w_width;
! }
! cts->cts_cur_text_width += cells;
! size += cells;
}
}
if (tp->tp_col - 1 > col)
break;
*** ../vim-9.0.0141/src/version.c 2022-08-05 10:52:27.444080680 +0100
--- src/version.c 2022-08-05 11:35:20.362525847 +0100
***************
*** 737,738 ****
--- 737,740 ----
{ /* Add new patch number below this line */
+ /**/
+ 142,
/**/
--
"Marriage is when a man and woman become as one; the trouble starts
when they try to decide which one"
/// Bram Moolenaar -- Br...@Moolenaar.net --
http://www.Moolenaar.net \\\
/// \\\
\\\ sponsor Vim, vote for features --
http://www.Vim.org/sponsor/ ///
\\\ help me help AIDS victims --
http://ICCF-Holland.org ///