summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-07-08 19:35:21 +0200
committerBram Moolenaar <Bram@vim.org>2020-07-08 19:35:21 +0200
commit6110e79a5872dd6c5529f909d1bd670e3325927b (patch)
tree1fb63ffbf024f240692cd439baa3c65e52d29c46
parent6b7a0a8c201bbace7e69fe0709f72b95092193df (diff)
patch 8.2.1160: Vim9: memory leak in allocated typesv8.2.1160
Problem: Vim9: memory leak in allocated types. Solution: Free the type pointers.
-rw-r--r--src/proto/vim9compile.pro1
-rw-r--r--src/userfunc.c5
-rw-r--r--src/version.c2
-rw-r--r--src/vim9compile.c8
-rw-r--r--src/vim9script.c2
5 files changed, 13 insertions, 5 deletions
diff --git a/src/proto/vim9compile.pro b/src/proto/vim9compile.pro
index b2677c8fe5..5486bd9236 100644
--- a/src/proto/vim9compile.pro
+++ b/src/proto/vim9compile.pro
@@ -1,5 +1,6 @@
/* vim9compile.c */
int check_defined(char_u *p, size_t len, cctx_T *cctx);
+void clear_type_list(garray_T *gap);
type_T *typval2type(typval_T *tv);
int check_type(type_T *expected, type_T *actual, int give_msg);
char_u *skip_type(char_u *start);
diff --git a/src/userfunc.c b/src/userfunc.c
index 121079149a..01c97dedd4 100644
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -1069,10 +1069,7 @@ func_clear_items(ufunc_T *fp)
VIM_CLEAR(fp->uf_arg_types);
VIM_CLEAR(fp->uf_def_arg_idx);
VIM_CLEAR(fp->uf_va_name);
- while (fp->uf_type_list.ga_len > 0)
- vim_free(((type_T **)fp->uf_type_list.ga_data)
- [--fp->uf_type_list.ga_len]);
- ga_clear(&fp->uf_type_list);
+ clear_type_list(&fp->uf_type_list);
#ifdef FEAT_LUA
if (fp->uf_cb_free != NULL)
diff --git a/src/version.c b/src/version.c
index 1af0262cc7..7b5f8f5d07 100644
--- a/src/version.c
+++ b/src/version.c
@@ -755,6 +755,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1160,
+/**/
1159,
/**/
1158,
diff --git a/src/vim9compile.c b/src/vim9compile.c
index 0aae8f2138..c0e4674de4 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -321,6 +321,14 @@ alloc_type(garray_T *type_gap)
return type;
}
+ void
+clear_type_list(garray_T *gap)
+{
+ while (gap->ga_len > 0)
+ vim_free(((type_T **)gap->ga_data)[--gap->ga_len]);
+ ga_clear(gap);
+}
+
static type_T *
get_list_type(type_T *member_type, garray_T *type_gap)
{
diff --git a/src/vim9script.c b/src/vim9script.c
index 77fe6b074a..c191113c84 100644
--- a/src/vim9script.c
+++ b/src/vim9script.c
@@ -126,7 +126,7 @@ free_imports(int sid)
}
ga_clear(&si->sn_imports);
ga_clear(&si->sn_var_vals);
- ga_clear(&si->sn_type_list);
+ clear_type_list(&si->sn_type_list);
}
/*