diff options
author | lonerover <pathfinder1644@yahoo.com> | 2017-01-09 12:01:50 +0800 |
---|---|---|
committer | lonerover <pathfinder1644@yahoo.com> | 2017-01-09 12:12:42 +0800 |
commit | f8f04350bd07bc0f3e6f618bc6c8ff4d7ce3d5ac (patch) | |
tree | b6cafef999680aa45d8ce5ee71223724e0ff4b45 /src | |
parent | 6f285226a9cc0e24bcb77a3213035cd26170ddb4 (diff) | |
download | rneovim-f8f04350bd07bc0f3e6f618bc6c8ff4d7ce3d5ac.tar.gz rneovim-f8f04350bd07bc0f3e6f618bc6c8ff4d7ce3d5ac.tar.bz2 rneovim-f8f04350bd07bc0f3e6f618bc6c8ff4d7ce3d5ac.zip |
vim-patch:7.4.2313
Problem: Crash when deleting an augroup and listing an autocommand.
(Dominique Pelle)
Solution: Make sure deleted_augroup is valid.
https://github.com/vim/vim/commit/b62cc36a600e2e1e5a1d1d484fef89898c847c4c
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/fileio.c | 24 | ||||
-rw-r--r-- | src/nvim/testdir/test_autocmd.vim | 9 | ||||
-rw-r--r-- | src/nvim/version.c | 2 |
3 files changed, 25 insertions, 10 deletions
diff --git a/src/nvim/fileio.c b/src/nvim/fileio.c index 31db8e2341..dbe4a144df 100644 --- a/src/nvim/fileio.c +++ b/src/nvim/fileio.c @@ -5366,6 +5366,7 @@ static AutoPatCmd *active_apc_list = NULL; /* stack of active autocommands */ */ static garray_T augroups = {0, 0, sizeof(char_u *), 10, NULL}; #define AUGROUP_NAME(i) (((char_u **)augroups.ga_data)[i]) +// use get_deleted_augroup() to get this static char_u *deleted_augroup = NULL; /* @@ -5381,6 +5382,14 @@ static event_T last_event; static int last_group; 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. */ @@ -5401,7 +5410,7 @@ static void show_autocmd(AutoPat *ap, event_T event) if (event != last_event || ap->group != last_group) { if (ap->group != AUGROUP_DEFAULT) { 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 { msg_puts_attr(AUGROUP_NAME(ap->group), hl_attr(HLF_T)); } @@ -5591,10 +5600,7 @@ static void au_del_group(char_u *name) } xfree(AUGROUP_NAME(i)); if (in_use) { - if (deleted_augroup == NULL) { - deleted_augroup = (char_u *)_("--Deleted--"); - } - AUGROUP_NAME(i) = deleted_augroup; + AUGROUP_NAME(i) = get_deleted_augroup(); } else { AUGROUP_NAME(i) = NULL; } @@ -5610,7 +5616,7 @@ static int au_find_group(const char_u *name) FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT { for (int 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) { return i; } @@ -5669,7 +5675,7 @@ void free_all_autocmds(void) for (i = 0; i < augroups.ga_len; i++) { s = ((char_u **)(augroups.ga_data))[i]; - if (s != deleted_augroup) { + if (s != get_deleted_augroup()) { xfree(s); } } @@ -7135,7 +7141,7 @@ char_u *get_augroup_name(expand_T *xp, int idx) return (char_u *)"END"; if (idx >= augroups.ga_len) /* end of list */ 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 return (char_u *)""; } @@ -7198,7 +7204,7 @@ char_u *get_event_name(expand_T *xp, int idx) { if (idx < augroups.ga_len) { // First list group names, if wanted 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 AUGROUP_NAME(idx); // return a name diff --git a/src/nvim/testdir/test_autocmd.vim b/src/nvim/testdir/test_autocmd.vim index 6db3bf76d3..7d786c88cf 100644 --- a/src/nvim/testdir/test_autocmd.vim +++ b/src/nvim/testdir/test_autocmd.vim @@ -183,3 +183,12 @@ func Test_augroup_warning() redir END call assert_true(match(res, "W19:") < 0) endfunc + +func Test_augroup_deleted() + " This caused a crash + augroup x + augroup! x + au VimEnter * echo + au VimEnter +endfunc + diff --git a/src/nvim/version.c b/src/nvim/version.c index 93d72a9b0a..2d5f2437de 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -127,7 +127,7 @@ static int included_patches[] = { // 2316 NA // 2315, // 2314, - // 2313, + 2313, 2312, // 2311 NA // 2310 NA |