mirror of
https://github.com/vim/vim.git
synced 2025-10-04 05:25:06 -04:00
patch 8.2.2636: memory leak when compiling inline function
Problem: Memory leak when compiling inline function. Solution: Free the prefetched line.
This commit is contained in:
@@ -2179,8 +2179,8 @@ clear_evalarg(evalarg_T *evalarg, exarg_T *eap)
|
|||||||
evalarg->eval_tofree = NULL;
|
evalarg->eval_tofree = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
vim_free(evalarg->eval_tofree_lambda);
|
VIM_CLEAR(evalarg->eval_tofree_cmdline);
|
||||||
evalarg->eval_tofree_lambda = NULL;
|
VIM_CLEAR(evalarg->eval_tofree_lambda);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1898,7 +1898,8 @@ EXTERN listitem_T range_list_item;
|
|||||||
// Passed to an eval() function to enable evaluation.
|
// Passed to an eval() function to enable evaluation.
|
||||||
EXTERN evalarg_T EVALARG_EVALUATE
|
EXTERN evalarg_T EVALARG_EVALUATE
|
||||||
# ifdef DO_INIT
|
# ifdef DO_INIT
|
||||||
= {EVAL_EVALUATE, 0, NULL, NULL, NULL, {0, 0, 0, 0, NULL}, NULL, NULL}
|
= {EVAL_EVALUATE, 0, NULL, NULL, NULL, {0, 0, 0, 0, NULL},
|
||||||
|
NULL, NULL, NULL}
|
||||||
# endif
|
# endif
|
||||||
;
|
;
|
||||||
#endif
|
#endif
|
||||||
|
@@ -1882,6 +1882,9 @@ typedef struct {
|
|||||||
// pointer to the last line obtained with getsourceline()
|
// pointer to the last line obtained with getsourceline()
|
||||||
char_u *eval_tofree;
|
char_u *eval_tofree;
|
||||||
|
|
||||||
|
// pointer to the last line of an inline function
|
||||||
|
char_u *eval_tofree_cmdline;
|
||||||
|
|
||||||
// pointer to the lines concatenated for a lambda.
|
// pointer to the lines concatenated for a lambda.
|
||||||
char_u *eval_tofree_lambda;
|
char_u *eval_tofree_lambda;
|
||||||
} evalarg_T;
|
} evalarg_T;
|
||||||
|
@@ -970,17 +970,18 @@ lambda_function_body(
|
|||||||
|
|
||||||
ga_init2(&newlines, (int)sizeof(char_u *), 10);
|
ga_init2(&newlines, (int)sizeof(char_u *), 10);
|
||||||
if (get_function_body(&eap, &newlines, NULL, &line_to_free) == FAIL)
|
if (get_function_body(&eap, &newlines, NULL, &line_to_free) == FAIL)
|
||||||
|
{
|
||||||
|
vim_free(cmdline);
|
||||||
goto erret;
|
goto erret;
|
||||||
|
}
|
||||||
if (cmdline != NULL)
|
if (cmdline != NULL)
|
||||||
{
|
{
|
||||||
// Something comes after the "}".
|
// Something comes after the "}".
|
||||||
*arg = eap.nextcmd;
|
*arg = eap.nextcmd;
|
||||||
if (evalarg->eval_cctx == NULL)
|
|
||||||
{
|
// "arg" points into cmdline, need to keep the line and free it later.
|
||||||
// Need to keep the line and free it/ later.
|
vim_free(evalarg->eval_tofree_cmdline);
|
||||||
vim_free(evalarg->eval_tofree_lambda);
|
evalarg->eval_tofree_cmdline = cmdline;
|
||||||
evalarg->eval_tofree_lambda = cmdline;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
*arg = (char_u *)"";
|
*arg = (char_u *)"";
|
||||||
|
@@ -750,6 +750,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 */
|
||||||
|
/**/
|
||||||
|
2636,
|
||||||
/**/
|
/**/
|
||||||
2635,
|
2635,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -3202,6 +3202,16 @@ compile_lambda(char_u **arg, cctx_T *cctx)
|
|||||||
// Compile the function into instructions.
|
// Compile the function into instructions.
|
||||||
compile_def_function(ufunc, TRUE, PROFILING(ufunc), cctx);
|
compile_def_function(ufunc, TRUE, PROFILING(ufunc), cctx);
|
||||||
|
|
||||||
|
// evalarg.eval_tofree_cmdline may have a copy of the last line and "*arg"
|
||||||
|
// points into it. Point to the original line to avoid a dangling pointer.
|
||||||
|
if (evalarg.eval_tofree_cmdline != NULL)
|
||||||
|
{
|
||||||
|
size_t off = *arg - evalarg.eval_tofree_cmdline;
|
||||||
|
|
||||||
|
*arg = ((char_u **)cctx->ctx_ufunc->uf_lines.ga_data)[cctx->ctx_lnum]
|
||||||
|
+ off;
|
||||||
|
}
|
||||||
|
|
||||||
clear_evalarg(&evalarg, NULL);
|
clear_evalarg(&evalarg, NULL);
|
||||||
|
|
||||||
if (ufunc->uf_def_status == UF_COMPILED)
|
if (ufunc->uf_def_status == UF_COMPILED)
|
||||||
|
Reference in New Issue
Block a user