mirror of
https://github.com/vim/vim.git
synced 2025-09-25 03:54:15 -04:00
patch 9.0.0260: using freed memory when using 'quickfixtextfunc' recursively
Problem: Using freed memory when using 'quickfixtextfunc' recursively. Solution: Do not allow for recursion.
This commit is contained in:
@@ -4674,6 +4674,11 @@ call_qftf_func(qf_list_T *qfl, int qf_winid, long start_idx, long end_idx)
|
|||||||
{
|
{
|
||||||
callback_T *cb = &qftf_cb;
|
callback_T *cb = &qftf_cb;
|
||||||
list_T *qftf_list = NULL;
|
list_T *qftf_list = NULL;
|
||||||
|
static int recursive = FALSE;
|
||||||
|
|
||||||
|
if (recursive)
|
||||||
|
return NULL; // this doesn't work properly recursively
|
||||||
|
recursive = TRUE;
|
||||||
|
|
||||||
// If 'quickfixtextfunc' is set, then use the user-supplied function to get
|
// If 'quickfixtextfunc' is set, then use the user-supplied function to get
|
||||||
// the text to display. Use the local value of 'quickfixtextfunc' if it is
|
// the text to display. Use the local value of 'quickfixtextfunc' if it is
|
||||||
@@ -4688,7 +4693,10 @@ call_qftf_func(qf_list_T *qfl, int qf_winid, long start_idx, long end_idx)
|
|||||||
|
|
||||||
// create the dict argument
|
// create the dict argument
|
||||||
if ((d = dict_alloc_lock(VAR_FIXED)) == NULL)
|
if ((d = dict_alloc_lock(VAR_FIXED)) == NULL)
|
||||||
|
{
|
||||||
|
recursive = FALSE;
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
dict_add_number(d, "quickfix", (long)IS_QF_LIST(qfl));
|
dict_add_number(d, "quickfix", (long)IS_QF_LIST(qfl));
|
||||||
dict_add_number(d, "winid", (long)qf_winid);
|
dict_add_number(d, "winid", (long)qf_winid);
|
||||||
dict_add_number(d, "id", (long)qfl->qf_id);
|
dict_add_number(d, "id", (long)qfl->qf_id);
|
||||||
@@ -4711,6 +4719,7 @@ call_qftf_func(qf_list_T *qfl, int qf_winid, long start_idx, long end_idx)
|
|||||||
dict_unref(d);
|
dict_unref(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
recursive = FALSE;
|
||||||
return qftf_list;
|
return qftf_list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -6351,4 +6351,17 @@ func Test_qflist_statusmsg()
|
|||||||
%bw!
|
%bw!
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Test_quickfixtextfunc_recursive()
|
||||||
|
func s:QFTfunc(o)
|
||||||
|
cgete '0'
|
||||||
|
endfunc
|
||||||
|
copen
|
||||||
|
let &quickfixtextfunc = 's:QFTfunc'
|
||||||
|
cex ""
|
||||||
|
|
||||||
|
let &quickfixtextfunc = ''
|
||||||
|
cclose
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
|
||||||
" vim: shiftwidth=2 sts=2 expandtab
|
" vim: shiftwidth=2 sts=2 expandtab
|
||||||
|
@@ -731,6 +731,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 */
|
||||||
|
/**/
|
||||||
|
260,
|
||||||
/**/
|
/**/
|
||||||
259,
|
259,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user