diff options
author | Bram Moolenaar <Bram@vim.org> | 2013-04-15 13:49:21 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2013-04-15 13:49:21 +0200 |
commit | b376647bb1dfa856613ef17945a4c97b0bcc2e56 (patch) | |
tree | 93272b46c7d134a50a186c4527dda3a08e7a60e8 | |
parent | 332ac0621c568a6ac88dc91e57b60c68b1c83b9d (diff) | |
download | vim-git-b376647bb1dfa856613ef17945a4c97b0bcc2e56.tar.gz |
updated for version 7.3.896v7.3.896
Problem: Memory leaks in Lua interface.
Solution: Fix the leaks, add tests. (Yukihiro Nakadaira)
-rw-r--r-- | src/if_lua.c | 27 | ||||
-rw-r--r-- | src/testdir/test85.in | 43 | ||||
-rw-r--r-- | src/testdir/test85.ok | 2 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 64 insertions, 10 deletions
diff --git a/src/if_lua.c b/src/if_lua.c index 0d1d08e2b..35e910615 100644 --- a/src/if_lua.c +++ b/src/if_lua.c @@ -709,8 +709,7 @@ luaV_list_index (lua_State *L) { const char *s = lua_tostring(L, 2); if (strncmp(s, "add", 3) == 0 - || strncmp(s, "insert", 6) == 0 - || strncmp(s, "extend", 6) == 0) + || strncmp(s, "insert", 6) == 0) { lua_getmetatable(L, 1); lua_getfield(L, -1, s); @@ -745,6 +744,7 @@ luaV_list_newindex (lua_State *L) luaV_totypval(L, 3, &v); clear_tv(&li->li_tv); copy_tv(&v, &li->li_tv); + clear_tv(&v); } return 0; } @@ -754,17 +754,17 @@ luaV_list_add (lua_State *L) { luaV_List *lis = luaV_checkudata(L, 1, LUAVIM_LIST); list_T *l = (list_T *) luaV_checkcache(L, (void *) *lis); - listitem_T *li; + typval_T v; if (l->lv_lock) luaL_error(L, "list is locked"); - li = listitem_alloc(); - if (li != NULL) + lua_settop(L, 2); + luaV_totypval(L, 2, &v); + if (list_append_tv(l, &v) == FAIL) { - typval_T v; - lua_settop(L, 2); - luaV_totypval(L, 2, &v); - list_append_tv(l, &v); + clear_tv(&v); + luaL_error(L, "Failed to add item to list"); } + clear_tv(&v); lua_settop(L, 1); return 1; } @@ -787,7 +787,12 @@ luaV_list_insert (lua_State *L) } lua_settop(L, 2); luaV_totypval(L, 2, &v); - list_insert_tv(l, &v, li); + if (list_insert_tv(l, &v, li) == FAIL) + { + clear_tv(&v); + luaL_error(L, "Failed to add item to list"); + } + clear_tv(&v); lua_settop(L, 1); return 1; } @@ -908,6 +913,7 @@ luaV_dict_newindex (lua_State *L) typval_T v; luaV_totypval(L, 3, &v); copy_tv(&v, &di->di_tv); + clear_tv(&v); } return 0; } @@ -1323,6 +1329,7 @@ luaV_eval(lua_State *L) typval_T *tv = eval_expr((char_u *) luaL_checkstring(L, 1), NULL); if (tv == NULL) luaL_error(L, "invalid expression"); luaV_pushtypval(L, tv); + free_tv(tv); return 1; } diff --git a/src/testdir/test85.in b/src/testdir/test85.in index a4c30d0f9..c5ca873a4 100644 --- a/src/testdir/test85.in +++ b/src/testdir/test85.in @@ -33,6 +33,49 @@ STARTTEST :let res = "FAILED" :endif :call setline(search("^3"), "circular test " . res) + +:let l = [] +:lua l = vim.eval("l") +:lua l:add(123) +:lua l:add("abc") +:lua l:add(vim.eval("[1, 2, 3]")) +:lua l:add(vim.eval("{'a':1, 'b':2, 'c':3}")) +:lua l:insert(123) +:lua l:insert("abc") +:lua l:insert(vim.eval("[1, 2, 3]")) +:lua l:insert(vim.eval("{'a':1, 'b':2, 'c':3}")) +:lua l[0] = l[0] +:lua l[1] = l[1] +:lua l[2] = l[2] +:lua l[3] = l[3] +:lua l[0] = 123 +:lua l[1] = "abc" +:lua l[2] = vim.eval("[1, 2, 3]") +:lua l[3] = vim.eval("{'a':1, 'b':2, 'c':3}") +:lua l[3] = nil +:lua l[2] = nil +:lua l[1] = nil +:lua l[0] = nil +:lua l = nil +:$put =string(l) + +:let d = {} +:lua d = vim.eval("d") +:lua d[0] = 123 +:lua d[1] = "abc" +:lua d[2] = vim.eval("[1, 2, 3]") +:lua d[3] = vim.eval("{'a':1, 'b':2, 'c':3}") +:lua d[4] = d[0] +:lua d[5] = d[1] +:lua d[6] = d[2] +:lua d[7] = d[3] +:lua d[3] = nil +:lua d[2] = nil +:lua d[1] = nil +:lua d[0] = nil +:lua d = nil +:$put =string(d) + :?^1?,$w! test.out :qa! ENDTEST diff --git a/src/testdir/test85.ok b/src/testdir/test85.ok index f8d2d3158..475348324 100644 --- a/src/testdir/test85.ok +++ b/src/testdir/test85.ok @@ -3,3 +3,5 @@ scalar test OK 2 line 2 dictionary with list OK circular test OK +[123.0, 'abc', [1, 2, 3], {'a': 1, 'b': 2, 'c': 3}] +{'4': 123.0, '5': 'abc', '6': [1, 2, 3], '7': {'a': 1, 'b': 2, 'c': 3}} diff --git a/src/version.c b/src/version.c index f7ee73986..121923a2f 100644 --- a/src/version.c +++ b/src/version.c @@ -729,6 +729,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 896, +/**/ 895, /**/ 894, |