changeset 10883:cb71a5468aca v8.0.0331

patch 8.0.0331: restoring help snapshot accesses freed memory commit https://github.com/vim/vim/commit/343b8c042967da82f2f022afa31f2c97a264c1c8 Author: Bram Moolenaar <Bram@vim.org> Date: Fri Feb 17 12:04:56 2017 +0100 patch 8.0.0331: restoring help snapshot accesses freed memory Problem: Restoring help snapshot accesses freed memory. (Dominique Pelle) Solution: Don't restore a snapshot when the window closes.
author Christian Brabandt <cb@256bit.org>
date Fri, 17 Feb 2017 12:15:05 +0100
parents 2ef6f4092d68
children 44174df54b0b
files src/Makefile src/testdir/Make_all.mak src/testdir/test_help.vim src/version.c src/window.c
diffstat 5 files changed, 17 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- 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 \
--- 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 \
new file mode 100644
--- /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
--- 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,
--- 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 
 	    || (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;
 }