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)
|
#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 */
|
/* flags obtained from the 'diffopt' option */
|
||||||
#define DIFF_FILLER 0x001 // display filler lines
|
#define DIFF_FILLER 0x001 // display filler lines
|
||||||
@ -908,6 +909,12 @@ ex_diffupdate(exarg_T *eap) // "eap" can be NULL
|
|||||||
int idx_new;
|
int idx_new;
|
||||||
diffio_T diffio;
|
diffio_T diffio;
|
||||||
|
|
||||||
|
if (diff_busy)
|
||||||
|
{
|
||||||
|
diff_need_update = TRUE;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Delete all diffblocks.
|
// Delete all diffblocks.
|
||||||
diff_clear(curtab);
|
diff_clear(curtab);
|
||||||
curtab->tp_diff_invalid = FALSE;
|
curtab->tp_diff_invalid = FALSE;
|
||||||
@ -2660,7 +2667,7 @@ ex_diffgetput(exarg_T *eap)
|
|||||||
if (diff_buf_idx(curbuf) != idx_to)
|
if (diff_buf_idx(curbuf) != idx_to)
|
||||||
{
|
{
|
||||||
EMSG(_("E787: Buffer changed unexpectedly"));
|
EMSG(_("E787: Buffer changed unexpectedly"));
|
||||||
return;
|
goto theend;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2831,7 +2838,13 @@ ex_diffgetput(exarg_T *eap)
|
|||||||
aucmd_restbuf(&aco);
|
aucmd_restbuf(&aco);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
theend:
|
||||||
diff_busy = FALSE;
|
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.
|
/* Check that the cursor is on a valid character and update it's position.
|
||||||
* When there were filler lines the topline has become invalid. */
|
* When there were filler lines the topline has become invalid. */
|
||||||
|
@ -794,6 +794,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 */
|
||||||
|
/**/
|
||||||
|
400,
|
||||||
/**/
|
/**/
|
||||||
399,
|
399,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user