1
0
forked from aniani/vim

patch 8.2.4453: :helpgrep may free an option that was not allocated

Problem:    :helpgrep may free an option that was not allocated. (Yegappan
            Lakshmanan)
Solution:   Check if the value was allocated.
This commit is contained in:
Bram Moolenaar
2022-02-23 12:06:00 +00:00
parent 2dada73a4e
commit 4791fcd825
5 changed files with 42 additions and 1 deletions

View File

@@ -4479,6 +4479,14 @@ get_encoding_default(void)
return (char_u *)NULL;
}
int
is_option_allocated(char *name)
{
int idx = findoption((char_u *)name);
return idx >= 0 && (options[idx].flags & P_ALLOCED);
}
/*
* Translate a string like "t_xx", "<t_xx>" or "<S-Tab>" to a key number.
* When "has_lt" is true there is a '<' before "*arg_arg".

View File

@@ -41,6 +41,7 @@ char *set_option_value(char_u *name, long number, char_u *string, int opt_flags)
char_u *get_term_code(char_u *tname);
char_u *get_highlight_default(void);
char_u *get_encoding_default(void);
int is_option_allocated(char *name);
int makeset(FILE *fd, int opt_flags, int local_only);
int makefoldset(FILE *fd);
void clear_termoptions(void);

View File

@@ -8235,6 +8235,7 @@ ex_helpgrep(exarg_T *eap)
{
regmatch_T regmatch;
char_u *save_cpo;
int save_cpo_allocated;
qf_info_T *qi = &ql_info;
int new_qi = FALSE;
char_u *au_name = NULL;
@@ -8265,6 +8266,7 @@ ex_helpgrep(exarg_T *eap)
// Make 'cpoptions' empty, the 'l' flag should not be used here.
save_cpo = p_cpo;
save_cpo_allocated = is_option_allocated("cpo");
p_cpo = empty_option;
incr_quickfix_busy();
@@ -8302,7 +8304,8 @@ ex_helpgrep(exarg_T *eap)
// changed and restored, need to restore in the complicated way.
if (*p_cpo == NUL)
set_option_value((char_u *)"cpo", 0L, save_cpo, 0);
free_string_option(save_cpo);
if (save_cpo_allocated)
free_string_option(save_cpo);
}
if (updated)

View File

@@ -745,6 +745,33 @@ def Test_helpgrep_vim9_restore_cpo()
helpclose
enddef
func Test_helpgrep_restore_cpo_aucmd()
let save_cpo = &cpo
augroup QF_Test
au!
autocmd BufNew * set cpo=acd
augroup END
helpgrep quickfix
call assert_equal('acd', &cpo)
%bw!
set cpo&vim
augroup QF_Test
au!
autocmd BufReadPost * set cpo=
augroup END
helpgrep buffer
call assert_equal('', &cpo)
augroup QF_Test
au!
augroup END
%bw!
let &cpo = save_cpo
endfunc
def Test_vim9_cexpr()
var text = 'somefile:95:error'
cexpr text

View File

@@ -750,6 +750,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
4453,
/**/
4452,
/**/