diff options
author | bfredl <bjorn.linse@gmail.com> | 2022-07-01 19:17:15 +0200 |
---|---|---|
committer | bfredl <bjorn.linse@gmail.com> | 2022-07-02 20:10:32 +0200 |
commit | 0160ff6aa0e2c60843e908ecd83eb9eaa416db02 (patch) | |
tree | e256d8168b6d67561a4fa077b1b015ac6632578b /src/nvim/lua/stdlib.c | |
parent | 9b4d0137b89d5d2ed6c62549578868d7a68fb094 (diff) | |
download | rneovim-0160ff6aa0e2c60843e908ecd83eb9eaa416db02.tar.gz rneovim-0160ff6aa0e2c60843e908ecd83eb9eaa416db02.tar.bz2 rneovim-0160ff6aa0e2c60843e908ecd83eb9eaa416db02.zip |
fix(lua): don't leak memory on error
Diffstat (limited to 'src/nvim/lua/stdlib.c')
-rw-r--r-- | src/nvim/lua/stdlib.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/src/nvim/lua/stdlib.c b/src/nvim/lua/stdlib.c index b911eb8b59..2a89592edb 100644 --- a/src/nvim/lua/stdlib.c +++ b/src/nvim/lua/stdlib.c @@ -300,7 +300,9 @@ int nlua_regex(lua_State *lstate) }); if (ERROR_SET(&err)) { - return luaL_error(lstate, "couldn't parse regex: %s", err.msg); + nlua_push_errstr(lstate, "couldn't parse regex: %s", err.msg); + api_clear_error(&err); + return lua_error(lstate); } assert(prog); @@ -338,12 +340,14 @@ static dict_T *nlua_get_var_scope(lua_State *lstate) dict = tabpage->tp_vars; } } else { - luaL_error(lstate, "invalid scope", err.msg); + luaL_error(lstate, "invalid scope"); return NULL; } if (ERROR_SET(&err)) { - luaL_error(lstate, "FAIL: %s", err.msg); + nlua_push_errstr(lstate, "scoped variable: %s", err.msg); + api_clear_error(&err); + lua_error(lstate); return NULL; } return dict; @@ -537,3 +541,14 @@ void nlua_state_add_stdlib(lua_State *const lstate, bool is_thread) lua_cjson_new(lstate); lua_setfield(lstate, -2, "json"); } + +/// like luaL_error, but allow cleanup +void nlua_push_errstr(lua_State *L, const char *fmt, ...) +{ + va_list argp; + va_start(argp, fmt); + luaL_where(L, 1); + lua_pushvfstring(L, fmt, argp); + va_end(argp); + lua_concat(L, 2); +} |