aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorlonerover <pathfinder1644@yahoo.com>2017-01-09 12:01:50 +0800
committerlonerover <pathfinder1644@yahoo.com>2017-01-09 12:12:42 +0800
commitf8f04350bd07bc0f3e6f618bc6c8ff4d7ce3d5ac (patch)
treeb6cafef999680aa45d8ce5ee71223724e0ff4b45 /src
parent6f285226a9cc0e24bcb77a3213035cd26170ddb4 (diff)
downloadrneovim-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.c24
-rw-r--r--src/nvim/testdir/test_autocmd.vim9
-rw-r--r--src/nvim/version.c2
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