To: vim_dev@googlegroups.com Subject: Patch 7.4.2141 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ 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. Files: src/userfunc.c, src/proto/userfunc.pro, src/eval.c *** ../vim-7.4.2140/src/userfunc.c 2016-08-01 16:29:42.516009792 +0200 --- src/userfunc.c 2016-08-01 17:07:48.890569129 +0200 *************** *** 3571,3581 **** * Search hashitem in parent scope. */ hashitem_T * ! find_hi_in_scoped_ht(char_u *name, char_u **varname, hashtab_T **pht) { funccall_T *old_current_funccal = current_funccal; hashtab_T *ht; hashitem_T *hi = NULL; if (current_funccal == NULL || current_funccal->func->uf_scoped == NULL) return NULL; --- 3571,3582 ---- * Search hashitem in parent scope. */ hashitem_T * ! find_hi_in_scoped_ht(char_u *name, hashtab_T **pht) { funccall_T *old_current_funccal = current_funccal; hashtab_T *ht; hashitem_T *hi = NULL; + char_u *varname; if (current_funccal == NULL || current_funccal->func->uf_scoped == NULL) return NULL; *************** *** 3584,3593 **** current_funccal = current_funccal->func->uf_scoped; while (current_funccal != NULL) { ! ht = find_var_ht(name, varname); ! if (ht != NULL && **varname != NUL) { ! hi = hash_find(ht, *varname); if (!HASHITEM_EMPTY(hi)) { *pht = ht; --- 3585,3594 ---- current_funccal = current_funccal->func->uf_scoped; while (current_funccal != NULL) { ! ht = find_var_ht(name, &varname); ! if (ht != NULL && *varname != NUL) { ! hi = hash_find(ht, varname); if (!HASHITEM_EMPTY(hi)) { *pht = ht; *************** *** 3607,3617 **** * Search variable in parent scope. */ dictitem_T * ! find_var_in_scoped_ht(char_u *name, char_u **varname, int no_autoload) { dictitem_T *v = NULL; funccall_T *old_current_funccal = current_funccal; hashtab_T *ht; if (current_funccal == NULL || current_funccal->func->uf_scoped == NULL) return NULL; --- 3608,3619 ---- * Search variable in parent scope. */ dictitem_T * ! find_var_in_scoped_ht(char_u *name, int no_autoload) { dictitem_T *v = NULL; funccall_T *old_current_funccal = current_funccal; hashtab_T *ht; + char_u *varname; if (current_funccal == NULL || current_funccal->func->uf_scoped == NULL) return NULL; *************** *** 3620,3630 **** current_funccal = current_funccal->func->uf_scoped; while (current_funccal) { ! ht = find_var_ht(name, varname ? &(*varname) : NULL); ! if (ht != NULL) { ! v = find_var_in_ht(ht, *name, ! varname ? *varname : NULL, no_autoload); if (v != NULL) break; } --- 3622,3631 ---- current_funccal = current_funccal->func->uf_scoped; while (current_funccal) { ! ht = find_var_ht(name, &varname); ! if (ht != NULL && *varname != NUL) { ! v = find_var_in_ht(ht, *name, varname, no_autoload); if (v != NULL) break; } *** ../vim-7.4.2140/src/proto/userfunc.pro 2016-08-01 15:40:24.179878441 +0200 --- src/proto/userfunc.pro 2016-08-01 17:07:52.302537193 +0200 *************** *** 50,57 **** void restore_current_funccal(void *f); void list_func_vars(int *first); dict_T *get_current_funccal_dict(hashtab_T *ht); ! hashitem_T *find_hi_in_scoped_ht(char_u *name, char_u **varname, hashtab_T **pht); ! dictitem_T *find_var_in_scoped_ht(char_u *name, char_u **varname, int no_autoload); int set_ref_in_previous_funccal(int copyID); int set_ref_in_call_stack(int copyID); int set_ref_in_func_args(int copyID); --- 50,57 ---- void restore_current_funccal(void *f); void list_func_vars(int *first); dict_T *get_current_funccal_dict(hashtab_T *ht); ! hashitem_T *find_hi_in_scoped_ht(char_u *name, hashtab_T **pht); ! dictitem_T *find_var_in_scoped_ht(char_u *name, int no_autoload); int set_ref_in_previous_funccal(int copyID); int set_ref_in_call_stack(int copyID); int set_ref_in_func_args(int copyID); *** ../vim-7.4.2140/src/eval.c 2016-08-01 15:40:24.175878478 +0200 --- src/eval.c 2016-08-01 17:06:46.663151594 +0200 *************** *** 2838,2844 **** } hi = hash_find(ht, varname); if (HASHITEM_EMPTY(hi)) ! hi = find_hi_in_scoped_ht(name, &varname, &ht); if (hi != NULL && !HASHITEM_EMPTY(hi)) { di = HI2DI(hi); --- 2838,2844 ---- } hi = hash_find(ht, varname); if (HASHITEM_EMPTY(hi)) ! hi = find_hi_in_scoped_ht(name, &ht); if (hi != NULL && !HASHITEM_EMPTY(hi)) { di = HI2DI(hi); *************** *** 7344,7351 **** return ret; /* Search in parent scope for lambda */ ! return find_var_in_scoped_ht(name, varname ? &varname : NULL, ! no_autoload || htp != NULL); } /* --- 7344,7350 ---- return ret; /* Search in parent scope for lambda */ ! return find_var_in_scoped_ht(name, no_autoload || htp != NULL); } /* *************** *** 7684,7690 **** /* Search in parent scope which is possible to reference from lambda */ if (v == NULL) ! v = find_var_in_scoped_ht(name, varname ? &varname : NULL, TRUE); if ((tv->v_type == VAR_FUNC || tv->v_type == VAR_PARTIAL) && var_check_func_name(name, v == NULL)) --- 7683,7689 ---- /* Search in parent scope which is possible to reference from lambda */ if (v == NULL) ! v = find_var_in_scoped_ht(name, TRUE); if ((tv->v_type == VAR_FUNC || tv->v_type == VAR_PARTIAL) && var_check_func_name(name, v == NULL)) *** ../vim-7.4.2140/src/version.c 2016-08-01 16:35:56.472496015 +0200 --- src/version.c 2016-08-01 17:09:42.877502309 +0200 *************** *** 765,766 **** --- 765,768 ---- { /* Add new patch number below this line */ + /**/ + 2141, /**/ -- A year spent in artificial intelligence is enough to make one believe in God. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///