mirror of
https://github.com/vim/vim.git
synced 2025-09-26 04:04:07 -04:00
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:
@@ -4479,6 +4479,14 @@ get_encoding_default(void)
|
|||||||
return (char_u *)NULL;
|
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.
|
* 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".
|
* When "has_lt" is true there is a '<' before "*arg_arg".
|
||||||
|
@@ -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_term_code(char_u *tname);
|
||||||
char_u *get_highlight_default(void);
|
char_u *get_highlight_default(void);
|
||||||
char_u *get_encoding_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 makeset(FILE *fd, int opt_flags, int local_only);
|
||||||
int makefoldset(FILE *fd);
|
int makefoldset(FILE *fd);
|
||||||
void clear_termoptions(void);
|
void clear_termoptions(void);
|
||||||
|
@@ -8235,6 +8235,7 @@ ex_helpgrep(exarg_T *eap)
|
|||||||
{
|
{
|
||||||
regmatch_T regmatch;
|
regmatch_T regmatch;
|
||||||
char_u *save_cpo;
|
char_u *save_cpo;
|
||||||
|
int save_cpo_allocated;
|
||||||
qf_info_T *qi = &ql_info;
|
qf_info_T *qi = &ql_info;
|
||||||
int new_qi = FALSE;
|
int new_qi = FALSE;
|
||||||
char_u *au_name = NULL;
|
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.
|
// Make 'cpoptions' empty, the 'l' flag should not be used here.
|
||||||
save_cpo = p_cpo;
|
save_cpo = p_cpo;
|
||||||
|
save_cpo_allocated = is_option_allocated("cpo");
|
||||||
p_cpo = empty_option;
|
p_cpo = empty_option;
|
||||||
|
|
||||||
incr_quickfix_busy();
|
incr_quickfix_busy();
|
||||||
@@ -8302,7 +8304,8 @@ ex_helpgrep(exarg_T *eap)
|
|||||||
// changed and restored, need to restore in the complicated way.
|
// changed and restored, need to restore in the complicated way.
|
||||||
if (*p_cpo == NUL)
|
if (*p_cpo == NUL)
|
||||||
set_option_value((char_u *)"cpo", 0L, save_cpo, 0);
|
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)
|
if (updated)
|
||||||
|
@@ -745,6 +745,33 @@ def Test_helpgrep_vim9_restore_cpo()
|
|||||||
helpclose
|
helpclose
|
||||||
enddef
|
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()
|
def Test_vim9_cexpr()
|
||||||
var text = 'somefile:95:error'
|
var text = 'somefile:95:error'
|
||||||
cexpr text
|
cexpr text
|
||||||
|
@@ -750,6 +750,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 */
|
||||||
|
/**/
|
||||||
|
4453,
|
||||||
/**/
|
/**/
|
||||||
4452,
|
4452,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user