Skip to content

Commit ba96e9a

Browse files
committed
patch 7.4.2141
Problem: Coverity reports bogus NULL check. Solution: When checking for a variable in the funccal scope don't pass the varname.
1 parent acadbea commit ba96e9a

4 files changed

Lines changed: 17 additions & 15 deletions

File tree

src/eval.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2838,7 +2838,7 @@ do_unlet(char_u *name, int forceit)
28382838
}
28392839
hi = hash_find(ht, varname);
28402840
if (HASHITEM_EMPTY(hi))
2841-
hi = find_hi_in_scoped_ht(name, &varname, &ht);
2841+
hi = find_hi_in_scoped_ht(name, &ht);
28422842
if (hi != NULL && !HASHITEM_EMPTY(hi))
28432843
{
28442844
di = HI2DI(hi);
@@ -7344,8 +7344,7 @@ find_var(char_u *name, hashtab_T **htp, int no_autoload)
73447344
return ret;
73457345

73467346
/* Search in parent scope for lambda */
7347-
return find_var_in_scoped_ht(name, varname ? &varname : NULL,
7348-
no_autoload || htp != NULL);
7347+
return find_var_in_scoped_ht(name, no_autoload || htp != NULL);
73497348
}
73507349

73517350
/*
@@ -7684,7 +7683,7 @@ set_var(
76847683

76857684
/* Search in parent scope which is possible to reference from lambda */
76867685
if (v == NULL)
7687-
v = find_var_in_scoped_ht(name, varname ? &varname : NULL, TRUE);
7686+
v = find_var_in_scoped_ht(name, TRUE);
76887687

76897688
if ((tv->v_type == VAR_FUNC || tv->v_type == VAR_PARTIAL)
76907689
&& var_check_func_name(name, v == NULL))

src/proto/userfunc.pro

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ void *clear_current_funccal(void);
5050
void restore_current_funccal(void *f);
5151
void list_func_vars(int *first);
5252
dict_T *get_current_funccal_dict(hashtab_T *ht);
53-
hashitem_T *find_hi_in_scoped_ht(char_u *name, char_u **varname, hashtab_T **pht);
54-
dictitem_T *find_var_in_scoped_ht(char_u *name, char_u **varname, int no_autoload);
53+
hashitem_T *find_hi_in_scoped_ht(char_u *name, hashtab_T **pht);
54+
dictitem_T *find_var_in_scoped_ht(char_u *name, int no_autoload);
5555
int set_ref_in_previous_funccal(int copyID);
5656
int set_ref_in_call_stack(int copyID);
5757
int set_ref_in_func_args(int copyID);

src/userfunc.c

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3571,11 +3571,12 @@ get_current_funccal_dict(hashtab_T *ht)
35713571
* Search hashitem in parent scope.
35723572
*/
35733573
hashitem_T *
3574-
find_hi_in_scoped_ht(char_u *name, char_u **varname, hashtab_T **pht)
3574+
find_hi_in_scoped_ht(char_u *name, hashtab_T **pht)
35753575
{
35763576
funccall_T *old_current_funccal = current_funccal;
35773577
hashtab_T *ht;
35783578
hashitem_T *hi = NULL;
3579+
char_u *varname;
35793580

35803581
if (current_funccal == NULL || current_funccal->func->uf_scoped == NULL)
35813582
return NULL;
@@ -3584,10 +3585,10 @@ find_hi_in_scoped_ht(char_u *name, char_u **varname, hashtab_T **pht)
35843585
current_funccal = current_funccal->func->uf_scoped;
35853586
while (current_funccal != NULL)
35863587
{
3587-
ht = find_var_ht(name, varname);
3588-
if (ht != NULL && **varname != NUL)
3588+
ht = find_var_ht(name, &varname);
3589+
if (ht != NULL && *varname != NUL)
35893590
{
3590-
hi = hash_find(ht, *varname);
3591+
hi = hash_find(ht, varname);
35913592
if (!HASHITEM_EMPTY(hi))
35923593
{
35933594
*pht = ht;
@@ -3607,11 +3608,12 @@ find_hi_in_scoped_ht(char_u *name, char_u **varname, hashtab_T **pht)
36073608
* Search variable in parent scope.
36083609
*/
36093610
dictitem_T *
3610-
find_var_in_scoped_ht(char_u *name, char_u **varname, int no_autoload)
3611+
find_var_in_scoped_ht(char_u *name, int no_autoload)
36113612
{
36123613
dictitem_T *v = NULL;
36133614
funccall_T *old_current_funccal = current_funccal;
36143615
hashtab_T *ht;
3616+
char_u *varname;
36153617

36163618
if (current_funccal == NULL || current_funccal->func->uf_scoped == NULL)
36173619
return NULL;
@@ -3620,11 +3622,10 @@ find_var_in_scoped_ht(char_u *name, char_u **varname, int no_autoload)
36203622
current_funccal = current_funccal->func->uf_scoped;
36213623
while (current_funccal)
36223624
{
3623-
ht = find_var_ht(name, varname ? &(*varname) : NULL);
3624-
if (ht != NULL)
3625+
ht = find_var_ht(name, &varname);
3626+
if (ht != NULL && *varname != NUL)
36253627
{
3626-
v = find_var_in_ht(ht, *name,
3627-
varname ? *varname : NULL, no_autoload);
3628+
v = find_var_in_ht(ht, *name, varname, no_autoload);
36283629
if (v != NULL)
36293630
break;
36303631
}

src/version.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -763,6 +763,8 @@ static char *(features[]) =
763763

764764
static int included_patches[] =
765765
{ /* Add new patch number below this line */
766+
/**/
767+
2141,
766768
/**/
767769
2140,
768770
/**/

0 commit comments

Comments
 (0)