patch 9.1.0270: a few minor issues to fix

The following is a collection of some small fixes:

- Problem:  Vim9: funcref pointer pt leaks, when function is not found
  Solution: Free funcref pointer in case of error (fixes: #14254)

- Problem:  memory leak of crypt state pointer allocation fails
  Solution: free crypt state pointer properly (fixes: #14253)

- Problem:  Vim9: Leaking memory when compiling dict fails
  Solution: Free the memory in case of error (fixes: #14252)

- Problem:  Coverity complains about derefencing obj_members pointer
            (after v9.1.0261)
  Solution: Verify that obj_members ptr is non-null before accessing it

  References: https://scan5.scan.coverity.com/#/project-view/41242/10101?selectedIssue=1596133

closes: #14412

Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
Christian Brabandt
2024-04-05 20:12:19 +02:00
parent e9ff79a7c9
commit 915f3bf4c1
5 changed files with 12 additions and 1 deletions

View File

@ -5556,7 +5556,10 @@ ml_encrypt_data(
new_data = alloc(size);
if (new_data == NULL)
{
crypt_free_state(state);
return NULL;
}
head_end = (char_u *)(&dp->db_index[dp->db_line_count]);
text_start = (char_u *)dp + dp->db_txt_start;
text_len = size - dp->db_txt_start;

View File

@ -555,7 +555,9 @@ parse_argument_types(
type = &t_any;
for (int om = 0; om < obj_member_count; ++om)
{
if (STRCMP(aname, obj_members[om].ocm_name) == 0)
if (obj_members != NULL
&& STRCMP(aname,
obj_members[om].ocm_name) == 0)
{
type = obj_members[om].ocm_type;
break;

View File

@ -704,6 +704,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
270,
/**/
269,
/**/

View File

@ -4573,6 +4573,7 @@ exec_instructions(ectx_T *ectx)
{
SOURCING_LNUM = iptr->isn_lnum;
iemsg("ufunc unexpectedly NULL for FUNCREF");
vim_free(pt);
goto theend;
}
if (fill_partial_and_closure(pt, ufunc,

View File

@ -1561,7 +1561,10 @@ compile_dict(char_u **arg, cctx_T *cctx, ppconst_T *ppconst)
if (d == NULL)
return FAIL;
if (generate_ppconst(cctx, ppconst) == FAIL)
{
dict_unref(d);
return FAIL;
}
for (;;)
{
char_u *key = NULL;