comparison src/drawline.c @ 32549:cceee401aa51 v9.0.1606

patch 9.0.1606: using freed memory when 'foldcolumn' is set Commit: https://github.com/vim/vim/commit/58e1e010454113a7c8a9b0327c54d2ee7d73d2fd Author: zeertzjq <zeertzjq@outlook.com> Date: Sun Jun 4 18:46:28 2023 +0100 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 https://github.com/vim/vim/issues/12492)
author Bram Moolenaar <Bram@vim.org>
date Sun, 04 Jun 2023 20:00:04 +0200
parents 75e56c94316d
children 25f4c1d11344
comparison
equal deleted inserted replaced
32548:f9fe29a477a2 32549:cceee401aa51
148 int extra_for_textprop; // wlv.n_extra set for textprop 148 int extra_for_textprop; // wlv.n_extra set for textprop
149 149
150 // saved "extra" items for when draw_state becomes WL_LINE (again) 150 // saved "extra" items for when draw_state becomes WL_LINE (again)
151 int saved_n_extra; 151 int saved_n_extra;
152 char_u *saved_p_extra; 152 char_u *saved_p_extra;
153 char_u *saved_p_extra_free;
153 int saved_extra_attr; 154 int saved_extra_attr;
154 int saved_n_attr_skip; 155 int saved_n_attr_skip;
155 int saved_extra_for_textprop; 156 int saved_extra_for_textprop;
156 int saved_c_extra; 157 int saved_c_extra;
157 int saved_c_final; 158 int saved_c_final;
228 wlv->p_extra_free = alloc(MAX_MCO * fdc + 1); 229 wlv->p_extra_free = alloc(MAX_MCO * fdc + 1);
229 if (wlv->p_extra_free == NULL) 230 if (wlv->p_extra_free == NULL)
230 return; 231 return;
231 232
232 wlv->n_extra = (int)fill_foldcolumn(wlv->p_extra_free, 233 wlv->n_extra = (int)fill_foldcolumn(wlv->p_extra_free,
233 wp, FALSE, wlv->lnum); 234 wp, FALSE, wlv->lnum);
234 wlv->p_extra_free[wlv->n_extra] = NUL; 235 wlv->p_extra_free[wlv->n_extra] = NUL;
235 wlv->p_extra = wlv->p_extra_free; 236 wlv->p_extra = wlv->p_extra_free;
236 wlv->c_extra = NUL; 237 wlv->c_extra = NUL;
237 wlv->c_final = NUL; 238 wlv->c_final = NUL;
238 if (use_cursor_line_highlight(wp, wlv->lnum)) 239 if (use_cursor_line_highlight(wp, wlv->lnum))
977 { 978 {
978 // reset the drawing state for the start of a wrapped line 979 // reset the drawing state for the start of a wrapped line
979 wlv->draw_state = WL_START; 980 wlv->draw_state = WL_START;
980 wlv->saved_n_extra = wlv->n_extra; 981 wlv->saved_n_extra = wlv->n_extra;
981 wlv->saved_p_extra = wlv->p_extra; 982 wlv->saved_p_extra = wlv->p_extra;
983 vim_free(wlv->saved_p_extra_free);
984 wlv->saved_p_extra_free = wlv->p_extra_free;
985 wlv->p_extra_free = NULL;
982 wlv->saved_extra_attr = wlv->extra_attr; 986 wlv->saved_extra_attr = wlv->extra_attr;
983 wlv->saved_n_attr_skip = wlv->n_attr_skip; 987 wlv->saved_n_attr_skip = wlv->n_attr_skip;
984 wlv->saved_extra_for_textprop = wlv->extra_for_textprop; 988 wlv->saved_extra_for_textprop = wlv->extra_for_textprop;
985 wlv->saved_c_extra = wlv->c_extra; 989 wlv->saved_c_extra = wlv->c_extra;
986 wlv->saved_c_final = wlv->c_final; 990 wlv->saved_c_final = wlv->c_final;
1013 wlv->n_extra = wlv->saved_n_extra; 1017 wlv->n_extra = wlv->saved_n_extra;
1014 wlv->saved_n_extra = 0; 1018 wlv->saved_n_extra = 0;
1015 wlv->c_extra = wlv->saved_c_extra; 1019 wlv->c_extra = wlv->saved_c_extra;
1016 wlv->c_final = wlv->saved_c_final; 1020 wlv->c_final = wlv->saved_c_final;
1017 wlv->p_extra = wlv->saved_p_extra; 1021 wlv->p_extra = wlv->saved_p_extra;
1022 vim_free(wlv->p_extra_free);
1023 wlv->p_extra_free = wlv->saved_p_extra_free;
1024 wlv->saved_p_extra_free = NULL;
1018 wlv->extra_attr = wlv->saved_extra_attr; 1025 wlv->extra_attr = wlv->saved_extra_attr;
1019 wlv->n_attr_skip = wlv->saved_n_attr_skip; 1026 wlv->n_attr_skip = wlv->saved_n_attr_skip;
1020 wlv->extra_for_textprop = wlv->saved_extra_for_textprop; 1027 wlv->extra_for_textprop = wlv->saved_extra_for_textprop;
1021 wlv->char_attr = wlv->saved_char_attr; 1028 wlv->char_attr = wlv->saved_char_attr;
1022 } 1029 }
4117 vim_free(text_prop_idxs); 4124 vim_free(text_prop_idxs);
4118 vim_free(p_extra_free2); 4125 vim_free(p_extra_free2);
4119 #endif 4126 #endif
4120 4127
4121 vim_free(wlv.p_extra_free); 4128 vim_free(wlv.p_extra_free);
4129 vim_free(wlv.saved_p_extra_free);
4122 return wlv.row; 4130 return wlv.row;
4123 } 4131 }