summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2017-10-23 21:53:30 +0200
committerBram Moolenaar <Bram@vim.org>2017-10-23 21:53:30 +0200
commit4f1982800f0aff28df6875e718a786f6c4b11ad9 (patch)
tree0cda1a53ffa28cd3bb662507ebff7ee1a1221def
parent2e4cb3b042faba5efc9b5a8b4f86942a417494ce (diff)
downloadvim-git-4f1982800f0aff28df6875e718a786f6c4b11ad9.tar.gz
patch 8.0.1214: accessing freed memory when EXITFREE is setv8.0.1214
Problem: Accessing freed memory when EXITFREE is set and there is more than one tab and window. (Dominique Pelle) Solution: Free options later. Skip redraw when exiting.
-rw-r--r--src/misc2.c4
-rw-r--r--src/screen.c2
-rw-r--r--src/version.c2
3 files changed, 6 insertions, 2 deletions
diff --git a/src/misc2.c b/src/misc2.c
index fac44c737..52ce097a8 100644
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -1135,7 +1135,6 @@ free_all_mem(void)
free_all_autocmds();
# endif
clear_termcodes();
- free_all_options();
free_all_marks();
alist_clear(&global_alist);
free_homedir();
@@ -1196,6 +1195,9 @@ free_all_mem(void)
/* Destroy all windows. Must come before freeing buffers. */
win_free_all();
+ /* Free all option values. Must come after closing windows. */
+ free_all_options();
+
/* Free all buffers. Reset 'autochdir' to avoid accessing things that
* were freed already. */
#ifdef FEAT_AUTOCHDIR
diff --git a/src/screen.c b/src/screen.c
index 3e08b600f..c92b17ebb 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -203,7 +203,7 @@ redraw_win_later(
win_T *wp,
int type)
{
- if (wp->w_redr_type < type)
+ if (!exiting && wp->w_redr_type < type)
{
wp->w_redr_type = type;
if (type >= NOT_VALID)
diff --git a/src/version.c b/src/version.c
index 160edbe45..c8bab5d4c 100644
--- a/src/version.c
+++ b/src/version.c
@@ -762,6 +762,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1214,
+/**/
1213,
/**/
1212,