0
0
mirror of https://github.com/vim/vim.git synced 2025-09-23 03:43:49 -04:00

patch 8.1.2280: crash when passing partial to substitute()

Problem:    Crash when passing partial to substitute().
Solution:   Take extra arguments into account. (closes #5186)
This commit is contained in:
Bram Moolenaar
2019-11-09 22:28:11 +01:00
parent dbd4316806
commit b0745b221d
6 changed files with 29 additions and 16 deletions

View File

@@ -1784,25 +1784,26 @@ static regsubmatch_T rsm; /* can only be used when can_f_submatch is TRUE */
#ifdef FEAT_EVAL
/*
* Put the submatches in "argv[0]" which is a list passed into call_func() by
* vim_regsub_both().
* Put the submatches in "argv[argskip]" which is a list passed into
* call_func() by vim_regsub_both().
*/
static int
fill_submatch_list(int argc UNUSED, typval_T *argv, int argcount)
fill_submatch_list(int argc UNUSED, typval_T *argv, int argskip, int argcount)
{
listitem_T *li;
int i;
char_u *s;
typval_T *listarg = argv + argskip;
if (argcount == 0)
/* called function doesn't take an argument */
return 0;
if (argcount == argskip)
// called function doesn't take a submatches argument
return argskip;
/* Relies on sl_list to be the first item in staticList10_T. */
init_static_list((staticList10_T *)(argv->vval.v_list));
// Relies on sl_list to be the first item in staticList10_T.
init_static_list((staticList10_T *)(listarg->vval.v_list));
/* There are always 10 list items in staticList10_T. */
li = argv->vval.v_list->lv_first;
// There are always 10 list items in staticList10_T.
li = listarg->vval.v_list->lv_first;
for (i = 0; i < 10; ++i)
{
s = rsm.sm_match->startp[i];
@@ -1814,7 +1815,7 @@ fill_submatch_list(int argc UNUSED, typval_T *argv, int argcount)
li->li_tv.vval.v_string = s;
li = li->li_next;
}
return 1;
return argskip + 1;
}
static void