vim-patch:9.2.0121: patch memory leak in list_extend_func() in list.c (#38205)

Problem:  memory leak in list_extend_func() in list.c
Solution: Free l1 on early return (Huihui Huang)

closes: vim/vim#19572

7ed37dc534

Co-authored-by: Huihui Huang <625173@qq.com>
This commit is contained in:
zeertzjq
2026-03-09 07:44:20 +08:00
committed by GitHub
parent 60b997b71d
commit 9a9b9c581c

View File

@@ -668,16 +668,15 @@ static void extend_list(typval_T *argvars, const char *arg_errmsg, bool is_new,
if (argvars[2].v_type != VAR_UNKNOWN) { if (argvars[2].v_type != VAR_UNKNOWN) {
int before = (int)tv_get_number_chk(&argvars[2], &error); int before = (int)tv_get_number_chk(&argvars[2], &error);
if (error) { if (error) {
return; // Type error; errmsg already given. goto cleanup; // Type error; errmsg already given.
} }
if (before == tv_list_len(l1)) { if (before == tv_list_len(l1)) {
item = NULL; item = NULL;
} else { } else {
item = tv_list_find(l1, before); item = tv_list_find(l1, before);
if (item == NULL) { if (item == NULL) {
semsg(_(e_list_index_out_of_range_nr), (int64_t)before); semsg(_(e_list_index_out_of_range_nr), (int64_t)before);
return; goto cleanup;
} }
} }
} else { } else {
@@ -694,6 +693,12 @@ static void extend_list(typval_T *argvars, const char *arg_errmsg, bool is_new,
} else { } else {
tv_copy(&argvars[0], rettv); tv_copy(&argvars[0], rettv);
} }
return;
cleanup:
if (is_new) {
tv_list_unref(l1);
}
} }
/// "extend()" or "extendnew()" function. /// "extend()" or "extendnew()" function.