forked from aniani/vim
		
	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.
This commit is contained in:
		
							
								
								
									
										10
									
								
								src/diff.c
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								src/diff.c
									
									
									
									
									
								
							| @@ -119,7 +119,12 @@ diff_buf_delete(buf_T *buf) | |||||||
| 	    tp->tp_diffbuf[i] = NULL; | 	    tp->tp_diffbuf[i] = NULL; | ||||||
| 	    tp->tp_diff_invalid = TRUE; | 	    tp->tp_diff_invalid = TRUE; | ||||||
| 	    if (tp == curtab) | 	    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; |     need_diff_redraw = FALSE; | ||||||
|     FOR_ALL_WINDOWS(wp) |     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); | 	    redraw_win_later(wp, SOME_VALID); | ||||||
| 	    if (wp != curwin) | 	    if (wp != curwin) | ||||||
|   | |||||||
| @@ -1603,5 +1603,17 @@ func Test_diff_scroll() | |||||||
|   call delete('Xright') |   call delete('Xright') | ||||||
| endfunc | 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 | " vim: shiftwidth=2 sts=2 expandtab | ||||||
|   | |||||||
| @@ -735,6 +735,8 @@ static char *(features[]) = | |||||||
|  |  | ||||||
| static int included_patches[] = | static int included_patches[] = | ||||||
| {   /* Add new patch number below this line */ | {   /* Add new patch number below this line */ | ||||||
|  | /**/ | ||||||
|  |     5163, | ||||||
| /**/ | /**/ | ||||||
|     5162, |     5162, | ||||||
| /**/ | /**/ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user