Fixed several off-by-one stack-manipulation errors

make_vector() should not call error() if arg0 is missing
spawn_param_env() needs to set envp
master
Mark Edgar 19 years ago
parent 0925ba938e
commit 8a083102cc

@ -57,7 +57,7 @@ static const char **make_vector(lua_State *L)
for (i = 0; i <= n; i++) { for (i = 0; i <= n; i++) {
lua_rawgeti(L, -2, i); /* ... arr vec elem */ lua_rawgeti(L, -2, i); /* ... arr vec elem */
vec[i] = lua_tostring(L, -1); vec[i] = lua_tostring(L, -1);
if (!vec[i]) { if (!vec[i] && i > 0) {
luaL_error(L, "expected string for argument %d, got %s", luaL_error(L, "expected string for argument %d, got %s",
i, lua_typename(L, lua_type(L, -1))); i, lua_typename(L, lua_type(L, -1)));
return 0; return 0;
@ -85,7 +85,7 @@ void spawn_param_env(struct spawn_params *p)
lua_newtable(L); /* ... envtab arr */ lua_newtable(L); /* ... envtab arr */
lua_pushliteral(L, "="); /* ... envtab arr "=" */ lua_pushliteral(L, "="); /* ... envtab arr "=" */
lua_pushnil(L); /* ... envtab arr "=" nil */ lua_pushnil(L); /* ... envtab arr "=" nil */
for (i = 0; lua_next(L, -3); i++) { /* ... envtab arr "=" k v */ for (i = 0; lua_next(L, -4); i++) { /* ... envtab arr "=" k v */
if (!lua_tostring(L, -2)) { if (!lua_tostring(L, -2)) {
luaL_error(L, "expected string for environment variable name, got %s", luaL_error(L, "expected string for environment variable name, got %s",
lua_typename(L, lua_type(L, -2))); lua_typename(L, lua_type(L, -2)));
@ -97,14 +97,14 @@ void spawn_param_env(struct spawn_params *p)
return; return;
} }
lua_pushvalue(L, -2); /* ... envtab arr "=" k v k */ lua_pushvalue(L, -2); /* ... envtab arr "=" k v k */
lua_pushvalue(L, -5); /* ... envtab arr "=" k v k "=" */ lua_pushvalue(L, -4); /* ... envtab arr "=" k v k "=" */
lua_pushvalue(L, -3); /* ... envtab arr "=" k v k "=" v */ lua_pushvalue(L, -3); /* ... envtab arr "=" k v k "=" v */
lua_concat(L, 3); /* ... envtab arr "=" k v "k=v" */ lua_concat(L, 3); /* ... envtab arr "=" k v "k=v" */
lua_rawseti(L, -4, i); /* ... envtab arr "=" k v */ lua_rawseti(L, -5, i); /* ... envtab arr "=" k v */
lua_pop(L, 1); /* ... envtab arr "=" k */ lua_pop(L, 1); /* ... envtab arr "=" k */
} /* ... envtab arr "=" */ } /* ... envtab arr "=" */
lua_pop(L, 1); /* ... envtab arr */ lua_pop(L, 1); /* ... envtab arr */
make_vector(L); /* ... envtab arr vector */ p->envp = make_vector(L); /* ... envtab arr vector */
} }
void spawn_param_redirect(struct spawn_params *p, const char *stdname, int fd) void spawn_param_redirect(struct spawn_params *p, const char *stdname, int fd)

Loading…
Cancel
Save