1
0
forked from aniani/vim

patch 8.2.3410: crash with linebreak, listchars and large tabstop

Problem:    Crash with linebreak, listchars and large tabstop.
Solution:   Account for different size listchars for a tab. (closes #8841)
This commit is contained in:
Bram Moolenaar
2021-09-07 20:45:31 +02:00
parent 65b6056659
commit 89a54b413a
3 changed files with 47 additions and 30 deletions

View File

@@ -2109,55 +2109,60 @@ win_line(
int i;
int saved_nextra = n_extra;
#ifdef FEAT_CONCEAL
# ifdef FEAT_CONCEAL
if (vcol_off > 0)
// there are characters to conceal
tab_len += vcol_off;
// boguscols before FIX_FOR_BOGUSCOLS macro from above
if (wp->w_p_list && wp->w_lcs_chars.tab1
&& old_boguscols > 0
&& n_extra > tab_len)
tab_len += n_extra - tab_len;
#endif
// if n_extra > 0, it gives the number of chars, to
# endif
// If n_extra > 0, it gives the number of chars, to
// use for a tab, else we need to calculate the width
// for a tab
// for a tab.
len = (tab_len * mb_char2len(wp->w_lcs_chars.tab2));
if (wp->w_lcs_chars.tab3)
len += mb_char2len(wp->w_lcs_chars.tab3);
if (n_extra > 0)
len += n_extra - tab_len;
c = wp->w_lcs_chars.tab1;
p = alloc(len + 1);
vim_memset(p, ' ', len);
p[len] = NUL;
vim_free(p_extra_free);
p_extra_free = p;
for (i = 0; i < tab_len; i++)
if (p == NULL)
n_extra = 0;
else
{
int lcs = wp->w_lcs_chars.tab2;
if (*p == NUL)
vim_memset(p, ' ', len);
p[len] = NUL;
vim_free(p_extra_free);
p_extra_free = p;
for (i = 0; i < tab_len; i++)
{
tab_len = i;
break;
}
int lcs = wp->w_lcs_chars.tab2;
// if tab3 is given, need to change the char
// for tab
if (wp->w_lcs_chars.tab3 && i == tab_len - 1)
lcs = wp->w_lcs_chars.tab3;
mb_char2bytes(lcs, p);
p += mb_char2len(lcs);
n_extra += mb_char2len(lcs)
if (*p == NUL)
{
tab_len = i;
break;
}
// if tab3 is given, use it for the last char
if (wp->w_lcs_chars.tab3 && i == tab_len - 1)
lcs = wp->w_lcs_chars.tab3;
p += mb_char2bytes(lcs, p);
n_extra += mb_char2len(lcs)
- (saved_nextra > 0 ? 1 : 0);
}
p_extra = p_extra_free;
# ifdef FEAT_CONCEAL
// n_extra will be increased by FIX_FOX_BOGUSCOLS
// macro below, so need to adjust for that here
if (vcol_off > 0)
n_extra -= vcol_off;
# endif
}
p_extra = p_extra_free;
#ifdef FEAT_CONCEAL
// n_extra will be increased by FIX_FOX_BOGUSCOLS
// macro below, so need to adjust for that here
if (vcol_off > 0)
n_extra -= vcol_off;
#endif
}
#endif
#ifdef FEAT_CONCEAL