summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2017-02-17 12:04:56 +0100
committerBram Moolenaar <Bram@vim.org>2017-02-17 12:04:56 +0100
commit343b8c042967da82f2f022afa31f2c97a264c1c8 (patch)
treea08119b65459093aa650a99303d30353b10ca3cb
parent84b2a381451e9068b09ef6d85f5e8cf1598e7355 (diff)
downloadvim-git-343b8c042967da82f2f022afa31f2c97a264c1c8.tar.gz
patch 8.0.0331: restoring help snapshot accesses freed memoryv8.0.0331
Problem: Restoring help snapshot accesses freed memory. (Dominique Pelle) Solution: Don't restore a snapshot when the window closes.
-rw-r--r--src/Makefile1
-rw-r--r--src/testdir/Make_all.mak1
-rw-r--r--src/testdir/test_help.vim10
-rw-r--r--src/version.c2
-rw-r--r--src/window.c5
5 files changed, 17 insertions, 2 deletions
diff --git a/src/Makefile b/src/Makefile
index e1443e558..153e526fd 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -2132,6 +2132,7 @@ test_arglist \
test_goto \
test_gui \
test_hardcopy \
+ test_help \
test_help_tagjump \
test_hide \
test_history \
diff --git a/src/testdir/Make_all.mak b/src/testdir/Make_all.mak
index 58291ea75..3ff7247c3 100644
--- a/src/testdir/Make_all.mak
+++ b/src/testdir/Make_all.mak
@@ -154,6 +154,7 @@ NEW_TESTS = test_arglist.res \
test_gn.res \
test_gui.res \
test_hardcopy.res \
+ test_help.res \
test_hide.res \
test_history.res \
test_hlsearch.res \
diff --git a/src/testdir/test_help.vim b/src/testdir/test_help.vim
new file mode 100644
index 000000000..ca095d067
--- /dev/null
+++ b/src/testdir/test_help.vim
@@ -0,0 +1,10 @@
+" Tests for :help
+
+func Test_help_restore_snapshot()
+ help
+ set buftype=
+ help
+ edit x
+ help
+ helpclose
+endfunc
diff --git a/src/version.c b/src/version.c
index 906c30c93..b014e74c9 100644
--- a/src/version.c
+++ b/src/version.c
@@ -765,6 +765,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 331,
+/**/
330,
/**/
329,
diff --git a/src/window.c b/src/window.c
index 6b7bd353a..c9771af58 100644
--- a/src/window.c
+++ b/src/window.c
@@ -6551,7 +6551,7 @@ restore_snapshot(
/*
* Check if frames "sn" and "fr" have the same layout, same following frames
- * and same children.
+ * and same children. And the window pointer is valid.
*/
static int
check_snapshot_rec(frame_T *sn, frame_T *fr)
@@ -6562,7 +6562,8 @@ check_snapshot_rec(frame_T *sn, frame_T *fr)
|| (sn->fr_next != NULL
&& check_snapshot_rec(sn->fr_next, fr->fr_next) == FAIL)
|| (sn->fr_child != NULL
- && check_snapshot_rec(sn->fr_child, fr->fr_child) == FAIL))
+ && check_snapshot_rec(sn->fr_child, fr->fr_child) == FAIL)
+ || !win_valid(sn->fr_win))
return FAIL;
return OK;
}