mirror of
https://github.com/vim/vim.git
synced 2025-07-26 11:04:33 -04:00
patch 8.1.0400: using freed memory with :diffget
Problem: Using freed memory with :diffget. Solution: Skip ex_diffupdate() while updating diffs. (closes #3442)
This commit is contained in:
parent
65985ac998
commit
d2b58c0a2c
17
src/diff.c
17
src/diff.c
@ -21,7 +21,8 @@
|
||||
|
||||
#if defined(FEAT_DIFF) || defined(PROTO)
|
||||
|
||||
static int diff_busy = FALSE; /* ex_diffgetput() is busy */
|
||||
static int diff_busy = FALSE; // using diff structs, don't change them
|
||||
static int diff_need_update = FALSE; // ex_diffupdate needs to be called
|
||||
|
||||
/* flags obtained from the 'diffopt' option */
|
||||
#define DIFF_FILLER 0x001 // display filler lines
|
||||
@ -908,6 +909,12 @@ ex_diffupdate(exarg_T *eap) // "eap" can be NULL
|
||||
int idx_new;
|
||||
diffio_T diffio;
|
||||
|
||||
if (diff_busy)
|
||||
{
|
||||
diff_need_update = TRUE;
|
||||
return;
|
||||
}
|
||||
|
||||
// Delete all diffblocks.
|
||||
diff_clear(curtab);
|
||||
curtab->tp_diff_invalid = FALSE;
|
||||
@ -2660,7 +2667,7 @@ ex_diffgetput(exarg_T *eap)
|
||||
if (diff_buf_idx(curbuf) != idx_to)
|
||||
{
|
||||
EMSG(_("E787: Buffer changed unexpectedly"));
|
||||
return;
|
||||
goto theend;
|
||||
}
|
||||
}
|
||||
|
||||
@ -2831,7 +2838,13 @@ ex_diffgetput(exarg_T *eap)
|
||||
aucmd_restbuf(&aco);
|
||||
}
|
||||
|
||||
theend:
|
||||
diff_busy = FALSE;
|
||||
if (diff_need_update)
|
||||
{
|
||||
diff_need_update = FALSE;
|
||||
ex_diffupdate(NULL);
|
||||
}
|
||||
|
||||
/* Check that the cursor is on a valid character and update it's position.
|
||||
* When there were filler lines the topline has become invalid. */
|
||||
|
@ -794,6 +794,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
400,
|
||||
/**/
|
||||
399,
|
||||
/**/
|
||||
|
Loading…
x
Reference in New Issue
Block a user