0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

patch 7.4.2313

Problem:    Crash when deleting an augroup and listing an autocommand.
            (Dominique Pelle)
Solution:   Make sure deleted_augroup is valid.
This commit is contained in:
Bram Moolenaar 2016-09-03 16:43:53 +02:00
parent 5a49789a9b
commit b62cc36a60
3 changed files with 26 additions and 8 deletions

View File

@ -7758,6 +7758,7 @@ static AutoPatCmd *active_apc_list = NULL; /* stack of active autocommands */
*/ */
static garray_T augroups = {0, 0, sizeof(char_u *), 10, NULL}; static garray_T augroups = {0, 0, sizeof(char_u *), 10, NULL};
#define AUGROUP_NAME(i) (((char_u **)augroups.ga_data)[i]) #define AUGROUP_NAME(i) (((char_u **)augroups.ga_data)[i])
/* use get_deleted_augroup() to get this */
static char_u *deleted_augroup = NULL; static char_u *deleted_augroup = NULL;
/* /*
@ -7790,6 +7791,14 @@ static event_T last_event;
static int last_group; static int last_group;
static int autocmd_blocked = 0; /* block all autocmds */ static int autocmd_blocked = 0; /* block all autocmds */
static char_u *
get_deleted_augroup(void)
{
if (deleted_augroup == NULL)
deleted_augroup = (char_u *)_("--Deleted--");
return deleted_augroup;
}
/* /*
* Show the autocommands for one AutoPat. * Show the autocommands for one AutoPat.
*/ */
@ -7813,7 +7822,7 @@ show_autocmd(AutoPat *ap, event_T event)
if (ap->group != AUGROUP_DEFAULT) if (ap->group != AUGROUP_DEFAULT)
{ {
if (AUGROUP_NAME(ap->group) == NULL) if (AUGROUP_NAME(ap->group) == NULL)
msg_puts_attr(deleted_augroup, hl_attr(HLF_E)); msg_puts_attr(get_deleted_augroup(), hl_attr(HLF_E));
else else
msg_puts_attr(AUGROUP_NAME(ap->group), hl_attr(HLF_T)); msg_puts_attr(AUGROUP_NAME(ap->group), hl_attr(HLF_T));
msg_puts((char_u *)" "); msg_puts((char_u *)" ");
@ -8029,9 +8038,7 @@ au_del_group(char_u *name)
vim_free(AUGROUP_NAME(i)); vim_free(AUGROUP_NAME(i));
if (in_use) if (in_use)
{ {
if (deleted_augroup == NULL) AUGROUP_NAME(i) = get_deleted_augroup();
deleted_augroup = (char_u *)_("--Deleted--");
AUGROUP_NAME(i) = deleted_augroup;
} }
else else
AUGROUP_NAME(i) = NULL; AUGROUP_NAME(i) = NULL;
@ -8048,7 +8055,7 @@ au_find_group(char_u *name)
int i; int i;
for (i = 0; i < augroups.ga_len; ++i) for (i = 0; i < augroups.ga_len; ++i)
if (AUGROUP_NAME(i) != NULL && AUGROUP_NAME(i) != deleted_augroup if (AUGROUP_NAME(i) != NULL && AUGROUP_NAME(i) != get_deleted_augroup()
&& STRCMP(AUGROUP_NAME(i), name) == 0) && STRCMP(AUGROUP_NAME(i), name) == 0)
return i; return i;
return AUGROUP_ERROR; return AUGROUP_ERROR;
@ -8116,7 +8123,7 @@ free_all_autocmds(void)
for (i = 0; i < augroups.ga_len; ++i) for (i = 0; i < augroups.ga_len; ++i)
{ {
s = ((char_u **)(augroups.ga_data))[i]; s = ((char_u **)(augroups.ga_data))[i];
if (s != deleted_augroup) if (s != get_deleted_augroup())
vim_free(s); vim_free(s);
} }
ga_clear(&augroups); ga_clear(&augroups);
@ -9865,7 +9872,7 @@ get_augroup_name(expand_T *xp UNUSED, int idx)
return (char_u *)"END"; return (char_u *)"END";
if (idx >= augroups.ga_len) /* end of list */ if (idx >= augroups.ga_len) /* end of list */
return NULL; return NULL;
if (AUGROUP_NAME(idx) == NULL || AUGROUP_NAME(idx) == deleted_augroup) if (AUGROUP_NAME(idx) == NULL || AUGROUP_NAME(idx) == get_deleted_augroup())
/* skip deleted entries */ /* skip deleted entries */
return (char_u *)""; return (char_u *)"";
return AUGROUP_NAME(idx); /* return a name */ return AUGROUP_NAME(idx); /* return a name */
@ -9931,7 +9938,7 @@ get_event_name(expand_T *xp UNUSED, int idx)
if (idx < augroups.ga_len) /* First list group names, if wanted */ if (idx < augroups.ga_len) /* First list group names, if wanted */
{ {
if (!include_groups || AUGROUP_NAME(idx) == NULL if (!include_groups || AUGROUP_NAME(idx) == NULL
|| AUGROUP_NAME(idx) == deleted_augroup) || AUGROUP_NAME(idx) == get_deleted_augroup())
return (char_u *)""; /* skip deleted entries */ return (char_u *)""; /* skip deleted entries */
return AUGROUP_NAME(idx); /* return a name */ return AUGROUP_NAME(idx); /* return a name */
} }

View File

@ -183,3 +183,12 @@ func Test_augroup_warning()
redir END redir END
call assert_true(match(res, "W19:") < 0) call assert_true(match(res, "W19:") < 0)
endfunc endfunc
func Test_augroup_deleted()
" This caused a crash
augroup x
augroup! x
au VimEnter * echo
au VimEnter
endfunc

View File

@ -763,6 +763,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 */
/**/
2313,
/**/ /**/
2312, 2312,
/**/ /**/