1
0
forked from aniani/vim

patch 8.0.0078

Problem:    Accessing freed memory in quickfix.
Solution:   Reset pointer when freeing 'errorformat'. (Domenique Pelle)
This commit is contained in:
Bram Moolenaar
2016-11-12 15:36:54 +01:00
parent e3505dfc85
commit 63bed3d319
3 changed files with 15 additions and 1 deletions

View File

@@ -114,6 +114,8 @@ struct efm_S
int conthere; /* %> used */ int conthere; /* %> used */
}; };
static efm_T *fmt_start = NULL; /* cached across qf_parse_line() calls */
static int qf_init_ext(qf_info_T *qi, char_u *efile, buf_T *buf, typval_T *tv, char_u *errorformat, int newlist, linenr_T lnumfirst, linenr_T lnumlast, char_u *qf_title); static int qf_init_ext(qf_info_T *qi, char_u *efile, buf_T *buf, typval_T *tv, char_u *errorformat, int newlist, linenr_T lnumfirst, linenr_T lnumlast, char_u *qf_title);
static void qf_store_title(qf_info_T *qi, char_u *title); static void qf_store_title(qf_info_T *qi, char_u *title);
static void qf_new_list(qf_info_T *qi, char_u *qf_title); static void qf_new_list(qf_info_T *qi, char_u *qf_title);
@@ -389,6 +391,7 @@ free_efm_list(efm_T **efm_first)
vim_regfree(efm_ptr->prog); vim_regfree(efm_ptr->prog);
vim_free(efm_ptr); vim_free(efm_ptr);
} }
fmt_start = NULL;
} }
/* Parse 'errorformat' option */ /* Parse 'errorformat' option */
@@ -786,7 +789,6 @@ qf_parse_line(
qffields_T *fields) qffields_T *fields)
{ {
efm_T *fmt_ptr; efm_T *fmt_ptr;
static efm_T *fmt_start = NULL; /* cached across calls */
char_u *ptr; char_u *ptr;
int len; int len;
int i; int i;

View File

@@ -1648,3 +1648,13 @@ function! Test_Autocmd_Exception()
set efm&vim set efm&vim
endfunction endfunction
function Test_caddbuffer()
" This used to cause a memory access in freed memory
let save_efm = &efm
set efm=%EEEE%m,%WWWW,%+CCCC%>%#,%GGGG%.#
cgetexpr ['WWWW', 'EEEE', 'CCCC']
let &efm = save_efm
cad
bwipe!
endfunc

View File

@@ -764,6 +764,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 */
/**/
78,
/**/ /**/
77, 77,
/**/ /**/