| File src/lua/vifm_handlers.c changed (mode: 100644) (index 939ba2755..511d80481) |
| ... |
... |
vifm_handlers_view(vlua_t *vlua, const char viewer[], const char path[], |
| 117 |
117 |
lua_setfield(vlua->lua, -2, "height"); |
lua_setfield(vlua->lua, -2, "height"); |
| 118 |
118 |
} |
} |
| 119 |
119 |
|
|
| 120 |
|
vlua_state_safe_mode_set(vlua->lua, 1); |
|
|
120 |
|
const int sm_cookie = vlua_state_safe_mode_on(vlua->lua); |
| 121 |
121 |
if(lua_pcall(vlua->lua, 1, 1, 0) != LUA_OK) |
if(lua_pcall(vlua->lua, 1, 1, 0) != LUA_OK) |
| 122 |
122 |
{ |
{ |
| 123 |
|
vlua_state_safe_mode_set(vlua->lua, 0); |
|
|
123 |
|
vlua_state_safe_mode_off(vlua->lua, sm_cookie); |
| 124 |
124 |
|
|
| 125 |
125 |
const char *error = lua_tostring(vlua->lua, -1); |
const char *error = lua_tostring(vlua->lua, -1); |
| 126 |
126 |
ui_sb_err(error); |
ui_sb_err(error); |
| |
| ... |
... |
vifm_handlers_view(vlua_t *vlua, const char viewer[], const char path[], |
| 128 |
128 |
return result; |
return result; |
| 129 |
129 |
} |
} |
| 130 |
130 |
|
|
| 131 |
|
vlua_state_safe_mode_set(vlua->lua, 0); |
|
|
131 |
|
vlua_state_safe_mode_off(vlua->lua, sm_cookie); |
| 132 |
132 |
|
|
| 133 |
133 |
if(!lua_istable(vlua->lua, -1)) |
if(!lua_istable(vlua->lua, -1)) |
| 134 |
134 |
{ |
{ |
| |
| ... |
... |
vifm_handlers_open(vlua_t *vlua, const char prog[], |
| 181 |
181 |
vifmentry_new(vlua->lua, entry); |
vifmentry_new(vlua->lua, entry); |
| 182 |
182 |
lua_setfield(vlua->lua, -2, "entry"); |
lua_setfield(vlua->lua, -2, "entry"); |
| 183 |
183 |
|
|
| 184 |
|
vlua_state_safe_mode_set(vlua->lua, 1); |
|
|
184 |
|
const int sm_cookie = vlua_state_safe_mode_on(vlua->lua); |
| 185 |
185 |
if(lua_pcall(vlua->lua, 1, 0, 0) != LUA_OK) |
if(lua_pcall(vlua->lua, 1, 0, 0) != LUA_OK) |
| 186 |
186 |
{ |
{ |
| 187 |
|
vlua_state_safe_mode_set(vlua->lua, 0); |
|
|
187 |
|
vlua_state_safe_mode_off(vlua->lua, sm_cookie); |
| 188 |
188 |
|
|
| 189 |
189 |
const char *error = lua_tostring(vlua->lua, -1); |
const char *error = lua_tostring(vlua->lua, -1); |
| 190 |
190 |
ui_sb_err(error); |
ui_sb_err(error); |
| |
| ... |
... |
vifm_handlers_open(vlua_t *vlua, const char prog[], |
| 192 |
192 |
return; |
return; |
| 193 |
193 |
} |
} |
| 194 |
194 |
|
|
| 195 |
|
vlua_state_safe_mode_set(vlua->lua, 0); |
|
|
195 |
|
vlua_state_safe_mode_off(vlua->lua, sm_cookie); |
| 196 |
196 |
lua_pop(vlua->lua, 2); |
lua_pop(vlua->lua, 2); |
| 197 |
197 |
} |
} |
| 198 |
198 |
|
|
| |
| ... |
... |
vifm_handlers_make_status_line(vlua_t *vlua, const char format[], |
| 223 |
223 |
lua_pushinteger(vlua->lua, width); |
lua_pushinteger(vlua->lua, width); |
| 224 |
224 |
lua_setfield(vlua->lua, -2, "width"); |
lua_setfield(vlua->lua, -2, "width"); |
| 225 |
225 |
|
|
| 226 |
|
vlua_state_safe_mode_set(vlua->lua, 1); |
|
|
226 |
|
const int sm_cookie = vlua_state_safe_mode_on(vlua->lua); |
| 227 |
227 |
if(lua_pcall(vlua->lua, 1, 1, 0) != LUA_OK) |
if(lua_pcall(vlua->lua, 1, 1, 0) != LUA_OK) |
| 228 |
228 |
{ |
{ |
| 229 |
|
vlua_state_safe_mode_set(vlua->lua, 0); |
|
|
229 |
|
vlua_state_safe_mode_off(vlua->lua, sm_cookie); |
| 230 |
230 |
|
|
| 231 |
231 |
char *error = strdup(lua_tostring(vlua->lua, -1)); |
char *error = strdup(lua_tostring(vlua->lua, -1)); |
| 232 |
232 |
lua_pop(vlua->lua, 3); |
lua_pop(vlua->lua, 3); |
| 233 |
233 |
return error; |
return error; |
| 234 |
234 |
} |
} |
| 235 |
235 |
|
|
| 236 |
|
vlua_state_safe_mode_set(vlua->lua, 0); |
|
|
236 |
|
vlua_state_safe_mode_off(vlua->lua, sm_cookie); |
| 237 |
237 |
|
|
| 238 |
238 |
if(!lua_istable(vlua->lua, -1)) |
if(!lua_istable(vlua->lua, -1)) |
| 239 |
239 |
{ |
{ |
| File src/lua/vifm_viewcolumns.c changed (mode: 100644) (index 77420d0f4..da07e0bd7) |
| ... |
... |
lua_viewcolumn_handler(void *data, size_t buf_len, char buf[], |
| 202 |
202 |
cdt->match_from = 0; |
cdt->match_from = 0; |
| 203 |
203 |
cdt->match_to = 0; |
cdt->match_to = 0; |
| 204 |
204 |
|
|
| 205 |
|
vlua_state_safe_mode_set(lua, 1); |
|
|
205 |
|
const int sm_cookie = vlua_state_safe_mode_on(lua); |
| 206 |
206 |
if(lua_pcall(lua, 1, 1, 0) != LUA_OK) |
if(lua_pcall(lua, 1, 1, 0) != LUA_OK) |
| 207 |
207 |
{ |
{ |
| 208 |
|
vlua_state_safe_mode_set(lua, 0); |
|
|
208 |
|
vlua_state_safe_mode_off(lua, sm_cookie); |
| 209 |
209 |
|
|
| 210 |
210 |
const char *error = lua_tostring(lua, -1); |
const char *error = lua_tostring(lua, -1); |
| 211 |
211 |
ui_sb_err(error); |
ui_sb_err(error); |
| |
| ... |
... |
lua_viewcolumn_handler(void *data, size_t buf_len, char buf[], |
| 214 |
214 |
return; |
return; |
| 215 |
215 |
} |
} |
| 216 |
216 |
|
|
| 217 |
|
vlua_state_safe_mode_set(lua, 0); |
|
|
217 |
|
vlua_state_safe_mode_off(lua, sm_cookie); |
| 218 |
218 |
|
|
| 219 |
219 |
if(!lua_istable(lua, -1)) |
if(!lua_istable(lua, -1)) |
| 220 |
220 |
{ |
{ |
| File src/lua/vlua_state.c changed (mode: 100644) (index e3c0d00e9..7b2ceb1ad) |
| ... |
... |
vlua_state_get_table(vlua_t *vlua, void *key) |
| 144 |
144 |
lua_gettable(vlua->lua, LUA_REGISTRYINDEX); |
lua_gettable(vlua->lua, LUA_REGISTRYINDEX); |
| 145 |
145 |
} |
} |
| 146 |
146 |
|
|
|
147 |
|
int |
|
148 |
|
vlua_state_safe_mode_on(lua_State *lua) |
|
149 |
|
{ |
|
150 |
|
vlua_t *vlua = get_state(lua); |
|
151 |
|
return vlua->safe_mode_level++; |
|
152 |
|
} |
|
153 |
|
|
| 147 |
154 |
void |
void |
| 148 |
|
vlua_state_safe_mode_set(lua_State *lua, int safe_mode) |
|
|
155 |
|
vlua_state_safe_mode_off(lua_State *lua, int cookie) |
| 149 |
156 |
{ |
{ |
| 150 |
157 |
vlua_t *vlua = get_state(lua); |
vlua_t *vlua = get_state(lua); |
| 151 |
|
assert(vlua->is_safe_mode_on != safe_mode && "Mismatched safe mode change!"); |
|
| 152 |
|
vlua->is_safe_mode_on = safe_mode; |
|
|
158 |
|
--vlua->safe_mode_level; |
|
159 |
|
|
|
160 |
|
assert(vlua->safe_mode_level == cookie && "Mismatched safe mode change!"); |
|
161 |
|
assert(vlua->safe_mode_level >= 0 && "Can't disabled disabled safe mode!"); |
| 153 |
162 |
} |
} |
| 154 |
163 |
|
|
| 155 |
164 |
int |
int |
| 156 |
165 |
vlua_state_proxy_call(lua_State *lua, int (*call)(lua_State *lua)) |
vlua_state_proxy_call(lua_State *lua, int (*call)(lua_State *lua)) |
| 157 |
166 |
{ |
{ |
| 158 |
|
if(get_state(lua)->is_safe_mode_on) |
|
|
167 |
|
if(get_state(lua)->safe_mode_level != 0) |
| 159 |
168 |
{ |
{ |
| 160 |
169 |
return luaL_error(lua, "%s", |
return luaL_error(lua, "%s", |
| 161 |
170 |
"Unsafe functions can't be called in this environment!"); |
"Unsafe functions can't be called in this environment!"); |
| File src/lua/vlua_state.h changed (mode: 100644) (index 98e9b71c4..9ad145ed8) |
| ... |
... |
struct vlua_t |
| 43 |
43 |
|
|
| 44 |
44 |
strlist_t strings; /* Interned strings. */ |
strlist_t strings; /* Interned strings. */ |
| 45 |
45 |
|
|
| 46 |
|
int is_safe_mode_on; /* Whether API must be limited to safe calls. */ |
|
|
46 |
|
int safe_mode_level; /* When non-zero, API is limited to safe calls. */ |
| 47 |
47 |
}; |
}; |
| 48 |
48 |
|
|
| 49 |
49 |
/* Creates new empty state. Returns the state or NULL. */ |
/* Creates new empty state. Returns the state or NULL. */ |
| |
| ... |
... |
void vlua_state_make_table(vlua_t *vlua, void *key); |
| 70 |
70 |
* the top of the stack. */ |
* the top of the stack. */ |
| 71 |
71 |
void vlua_state_get_table(vlua_t *vlua, void *key); |
void vlua_state_get_table(vlua_t *vlua, void *key); |
| 72 |
72 |
|
|
| 73 |
|
/* Enables or disables safe mode. */ |
|
| 74 |
|
void vlua_state_safe_mode_set(struct lua_State *lua, int safe_mode); |
|
|
73 |
|
/* Enables safe mode if it's not already on. Returns cookie value to be passed |
|
74 |
|
* to vlua_state_safe_mode_off(). */ |
|
75 |
|
int vlua_state_safe_mode_on(struct lua_State *lua); |
|
76 |
|
|
|
77 |
|
/* Disables safe mode. Accepts cookie from a corresponding call to |
|
78 |
|
* vlua_state_safe_mode_on(). */ |
|
79 |
|
void vlua_state_safe_mode_off(struct lua_State *lua, int cookie); |
| 75 |
80 |
|
|
| 76 |
81 |
/* Runs a Lua C function if it's allowed to run in current context. */ |
/* Runs a Lua C function if it's allowed to run in current context. */ |
| 77 |
82 |
int vlua_state_proxy_call(struct lua_State *lua, |
int vlua_state_proxy_call(struct lua_State *lua, |