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 -- [email protected] -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/20220805104541.97AE21C07BF%40moolenaar.net.

Raspunde prin e-mail lui