# HG changeset patch # User Christian Brabandt # Date 1487330105 -3600 # Node ID cb71a5468acaba4fc080b2863b34f8c2d95b4574 # Parent 2ef6f4092d6867f16f670dd876d81a3a2af73131 patch 8.0.0331: restoring help snapshot accesses freed memory commit https://github.com/vim/vim/commit/343b8c042967da82f2f022afa31f2c97a264c1c8 Author: Bram Moolenaar 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. diff --git a/src/Makefile b/src/Makefile --- 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 --- 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 --- /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 --- 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 --- 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; }