To: vim_dev@googlegroups.com Subject: Patch 9.0.0142 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ 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 -- Bram@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 ///