aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/lua/executor.c
diff options
context:
space:
mode:
authorii14 <59243201+ii14@users.noreply.github.com>2022-12-05 19:59:04 +0100
committerGitHub <noreply@github.com>2022-12-05 11:59:04 -0700
commitf3bf1fbf600050fde155e6a1a766b6f848012208 (patch)
tree4de99c04bf7d666ac15707e418468640c0946b1a /src/nvim/lua/executor.c
parent707df880545703bc6f4db1af6e46820becbcd911 (diff)
downloadrneovim-f3bf1fbf600050fde155e6a1a766b6f848012208.tar.gz
rneovim-f3bf1fbf600050fde155e6a1a766b6f848012208.tar.bz2
rneovim-f3bf1fbf600050fde155e6a1a766b6f848012208.zip
fix(secure): crash when hitting escape in prompt (#21283)
- use pcall when calling vim.secure.read from C - catch keyboard interrupts in vim.secure.read, rethrow other errors - selecting "view" in prompt runs :view command - simplify lua stack cleanup with lua_gettop and lua_settop Co-authored-by: ii14 <ii14@users.noreply.github.com>
Diffstat (limited to 'src/nvim/lua/executor.c')
-rw-r--r--src/nvim/lua/executor.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/src/nvim/lua/executor.c b/src/nvim/lua/executor.c
index 48ab2e3d70..1c8fe3e28e 100644
--- a/src/nvim/lua/executor.c
+++ b/src/nvim/lua/executor.c
@@ -2197,11 +2197,17 @@ plain:
char *nlua_read_secure(const char *path)
{
lua_State *const lstate = global_lstate;
+ const int top = lua_gettop(lstate);
+
lua_getglobal(lstate, "vim");
lua_getfield(lstate, -1, "secure");
lua_getfield(lstate, -1, "read");
lua_pushstring(lstate, path);
- lua_call(lstate, 1, 1);
+ if (nlua_pcall(lstate, 1, 1)) {
+ nlua_error(lstate, _("Error executing vim.secure.read: %.*s"));
+ lua_settop(lstate, top);
+ return NULL;
+ }
size_t len = 0;
const char *contents = lua_tolstring(lstate, -1, &len);
@@ -2212,15 +2218,15 @@ char *nlua_read_secure(const char *path)
memcpy(buf, contents, len + 1);
}
- // Pop return value, "vim", and "secure"
- lua_pop(lstate, 3);
-
+ lua_settop(lstate, top);
return buf;
}
bool nlua_trust(const char *action, const char *path)
{
lua_State *const lstate = global_lstate;
+ const int top = lua_gettop(lstate);
+
lua_getglobal(lstate, "vim");
lua_getfield(lstate, -1, "secure");
lua_getfield(lstate, -1, "trust");
@@ -2241,6 +2247,7 @@ bool nlua_trust(const char *action, const char *path)
if (nlua_pcall(lstate, 1, 2)) {
nlua_error(lstate, _("Error executing vim.secure.trust: %.*s"));
+ lua_settop(lstate, top);
return false;
}
@@ -2260,8 +2267,6 @@ bool nlua_trust(const char *action, const char *path)
}
}
- // Pop return values, "vim" and "secure"
- lua_pop(lstate, 4);
-
+ lua_settop(lstate, top);
return success;
}