forked from aniani/vim
patch 9.0.1606: using freed memory when 'foldcolumn' is set
Problem: Using freed memory when 'foldcolumn' is set. Solution: Save extra pointer to free it later. (closes #12492)
This commit is contained in:
@@ -150,6 +150,7 @@ typedef struct {
|
|||||||
// saved "extra" items for when draw_state becomes WL_LINE (again)
|
// saved "extra" items for when draw_state becomes WL_LINE (again)
|
||||||
int saved_n_extra;
|
int saved_n_extra;
|
||||||
char_u *saved_p_extra;
|
char_u *saved_p_extra;
|
||||||
|
char_u *saved_p_extra_free;
|
||||||
int saved_extra_attr;
|
int saved_extra_attr;
|
||||||
int saved_n_attr_skip;
|
int saved_n_attr_skip;
|
||||||
int saved_extra_for_textprop;
|
int saved_extra_for_textprop;
|
||||||
@@ -979,6 +980,9 @@ win_line_start(win_T *wp UNUSED, winlinevars_T *wlv, int save_extra)
|
|||||||
wlv->draw_state = WL_START;
|
wlv->draw_state = WL_START;
|
||||||
wlv->saved_n_extra = wlv->n_extra;
|
wlv->saved_n_extra = wlv->n_extra;
|
||||||
wlv->saved_p_extra = wlv->p_extra;
|
wlv->saved_p_extra = wlv->p_extra;
|
||||||
|
vim_free(wlv->saved_p_extra_free);
|
||||||
|
wlv->saved_p_extra_free = wlv->p_extra_free;
|
||||||
|
wlv->p_extra_free = NULL;
|
||||||
wlv->saved_extra_attr = wlv->extra_attr;
|
wlv->saved_extra_attr = wlv->extra_attr;
|
||||||
wlv->saved_n_attr_skip = wlv->n_attr_skip;
|
wlv->saved_n_attr_skip = wlv->n_attr_skip;
|
||||||
wlv->saved_extra_for_textprop = wlv->extra_for_textprop;
|
wlv->saved_extra_for_textprop = wlv->extra_for_textprop;
|
||||||
@@ -1015,6 +1019,9 @@ win_line_continue(winlinevars_T *wlv)
|
|||||||
wlv->c_extra = wlv->saved_c_extra;
|
wlv->c_extra = wlv->saved_c_extra;
|
||||||
wlv->c_final = wlv->saved_c_final;
|
wlv->c_final = wlv->saved_c_final;
|
||||||
wlv->p_extra = wlv->saved_p_extra;
|
wlv->p_extra = wlv->saved_p_extra;
|
||||||
|
vim_free(wlv->p_extra_free);
|
||||||
|
wlv->p_extra_free = wlv->saved_p_extra_free;
|
||||||
|
wlv->saved_p_extra_free = NULL;
|
||||||
wlv->extra_attr = wlv->saved_extra_attr;
|
wlv->extra_attr = wlv->saved_extra_attr;
|
||||||
wlv->n_attr_skip = wlv->saved_n_attr_skip;
|
wlv->n_attr_skip = wlv->saved_n_attr_skip;
|
||||||
wlv->extra_for_textprop = wlv->saved_extra_for_textprop;
|
wlv->extra_for_textprop = wlv->saved_extra_for_textprop;
|
||||||
@@ -4119,5 +4126,6 @@ win_line(
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
vim_free(wlv.p_extra_free);
|
vim_free(wlv.p_extra_free);
|
||||||
|
vim_free(wlv.saved_p_extra_free);
|
||||||
return wlv.row;
|
return wlv.row;
|
||||||
}
|
}
|
||||||
|
@@ -1755,4 +1755,18 @@ func Test_fold_screenrow_motion()
|
|||||||
norm Ggkzo
|
norm Ggkzo
|
||||||
call assert_equal(1, line('.'))
|
call assert_equal(1, line('.'))
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
" This was using freed memory
|
||||||
|
func Test_foldcolumn_linebreak_control_char()
|
||||||
|
CheckFeature linebreak
|
||||||
|
|
||||||
|
5vnew
|
||||||
|
setlocal foldcolumn=1 linebreak
|
||||||
|
call setline(1, "aaa\<C-A>b")
|
||||||
|
redraw
|
||||||
|
call assert_equal([' aaa^', ' Ab '], ScreenLines([1, 2], 5))
|
||||||
|
call assert_equal(screenattr(1, 5), screenattr(2, 2))
|
||||||
|
|
||||||
|
bwipe!
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
@@ -695,6 +695,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1606,
|
||||||
/**/
|
/**/
|
||||||
1605,
|
1605,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user