Mercurial > vim
changeset 29293:bf4d7898cf93 v8.2.5163
patch 8.2.5163: crash when deleting buffers in diff mode
Commit: https://github.com/vim/vim/commit/cd38bb4d83c942c4bad596835c6766cbf32e5195
Author: Bram Moolenaar <Bram@vim.org>
Date: Sun Jun 26 14:04:07 2022 +0100
patch 8.2.5163: crash when deleting buffers in diff mode
Problem: Crash when deleting buffers in diff mode.
Solution: Recompute diffs later. Skip window without a valid buffer.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sun, 26 Jun 2022 15:15:03 +0200 |
parents | 12334597cc01 |
children | 87c78d53b503 |
files | src/diff.c src/testdir/test_diffmode.vim src/version.c |
diffstat | 3 files changed, 22 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/diff.c +++ b/src/diff.c @@ -119,7 +119,12 @@ diff_buf_delete(buf_T *buf) tp->tp_diffbuf[i] = NULL; tp->tp_diff_invalid = TRUE; if (tp == curtab) - diff_redraw(TRUE); + { + // don't redraw right away, more might change or buffer state + // is invalid right now + need_diff_redraw = TRUE; + redraw_later(VALID); + } } } } @@ -670,7 +675,8 @@ diff_redraw( need_diff_redraw = FALSE; FOR_ALL_WINDOWS(wp) - if (wp->w_p_diff) + // when closing windows or wiping buffers skip invalid window + if (wp->w_p_diff && buf_valid(wp->w_buffer)) { redraw_win_later(wp, SOME_VALID); if (wp != curwin)
--- a/src/testdir/test_diffmode.vim +++ b/src/testdir/test_diffmode.vim @@ -1603,5 +1603,17 @@ func Test_diff_scroll() call delete('Xright') endfunc +" This was trying to update diffs for a buffer being closed +func Test_diff_only() + silent! lfile + set diff + lopen + norm o + silent! norm o + + set nodiff + %bwipe! +endfunc + " vim: shiftwidth=2 sts=2 expandtab