diff options
author | Bram Moolenaar <Bram@vim.org> | 2018-07-13 22:08:23 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2018-07-13 22:08:23 +0200 |
commit | d6ef5f9b3d3df2d5dcc666c8741e99fcc77043f6 (patch) | |
tree | 6f06e82539813973994bb16e488b92237a20e60b | |
parent | efc81331e7bceafa2d7bc452a98d6ec1943b4292 (diff) | |
download | vim-git-d6ef5f9b3d3df2d5dcc666c8741e99fcc77043f6.tar.gz |
patch 8.1.0180: static analysis errors in Lua interfacev8.1.0180
Problem: Static analysis errors in Lua interface. (Coverity)
Solution: Check for NULL pointers.
-rw-r--r-- | src/if_lua.c | 47 | ||||
-rw-r--r-- | src/version.c | 2 |
2 files changed, 34 insertions, 15 deletions
diff --git a/src/if_lua.c b/src/if_lua.c index f0d5a4d04..3886401be 100644 --- a/src/if_lua.c +++ b/src/if_lua.c @@ -958,7 +958,9 @@ luaV_dict_newindex(lua_State *L) typval_T v; if (d->dv_lock) luaL_error(L, "dict is locked"); - if (key != NULL && *key == NUL) + if (key == NULL) + return 0; + if (*key == NUL) luaL_error(L, "empty key"); if (!lua_isnil(L, 3)) { /* read value? */ luaV_checktypval(L, 3, &v, "setting dict item"); @@ -968,13 +970,15 @@ luaV_dict_newindex(lua_State *L) di = dict_find(d, key, -1); if (di == NULL) /* non-existing key? */ { - if (lua_isnil(L, 3)) return 0; + if (lua_isnil(L, 3)) + return 0; di = dictitem_alloc(key); - if (di == NULL) return 0; + if (di == NULL) + return 0; if (dict_add(d, di) == FAIL) { - vim_free(di); - return 0; + vim_free(di); + return 0; } } else @@ -1066,15 +1070,21 @@ luaV_funcref_call(lua_State *L) f->args.vval.v_list = list_alloc(); rettv.v_type = VAR_UNKNOWN; /* as in clear_tv */ - for (i = 0; i < n; i++) { - luaV_checktypval(L, i + 2, &v, "calling funcref"); - list_append_tv(f->args.vval.v_list, &v); + if (f->args.vval.v_list == NULL) + status = FAIL; + else + { + for (i = 0; i < n; i++) { + luaV_checktypval(L, i + 2, &v, "calling funcref"); + list_append_tv(f->args.vval.v_list, &v); + } + status = func_call(f->tv.vval.v_string, &f->args, + NULL, f->self, &rettv); + if (status == OK) + luaV_pushtypval(L, &rettv); + clear_tv(&f->args); + clear_tv(&rettv); } - status = func_call(f->tv.vval.v_string, &f->args, NULL, f->self, &rettv); - if (status == OK) - luaV_pushtypval(L, &rettv); - clear_tv(&f->args); - clear_tv(&rettv); if (status != OK) luaL_error(L, "cannot call funcref"); return 1; @@ -1560,13 +1570,20 @@ luaV_dict(lua_State *L) char_u *key; dictitem_T *di; typval_T v; + lua_pushvalue(L, -2); /* dup key in case it's a number */ key = (char_u *) lua_tostring(L, -1); - if (key != NULL && *key == NUL) + if (key == NULL) + { + lua_pushnil(L); + return 1; + } + if (*key == NUL) luaL_error(L, "table has empty key"); luaV_checktypval(L, -2, &v, "vim.dict"); /* value */ di = dictitem_alloc(key); - if (di == NULL || dict_add(d, di) == FAIL) { + if (di == NULL || dict_add(d, di) == FAIL) + { vim_free(di); lua_pushnil(L); return 1; diff --git a/src/version.c b/src/version.c index 1dae71fcc..727590184 100644 --- a/src/version.c +++ b/src/version.c @@ -790,6 +790,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 180, +/**/ 179, /**/ 178, |