aboutsummaryrefslogtreecommitdiff
path: root/lua.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2005-04-11 15:01:35 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2005-04-11 15:01:35 -0300
commit2873d4efff18e972a94a6d20c231b0ac062bc4ca (patch)
tree53f0f1a1bc60b521fa5ff50aaf6c2813275c7c08 /lua.c
parenta7ea0c71e80fa9f5f433b5495108164e6131404e (diff)
downloadlua-2873d4efff18e972a94a6d20c231b0ac062bc4ca.tar.gz
lua-2873d4efff18e972a94a6d20c231b0ac062bc4ca.tar.bz2
lua-2873d4efff18e972a94a6d20c231b0ac062bc4ca.zip
stack could overflow with too many command-line arguments
Diffstat (limited to 'lua.c')
-rw-r--r--lua.c25
1 files changed, 12 insertions, 13 deletions
diff --git a/lua.c b/lua.c
index 60fc3259..7f3a4943 100644
--- a/lua.c
+++ b/lua.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lua.c,v 1.139 2005/03/29 16:47:48 roberto Exp roberto $ 2** $Id: lua.c,v 1.140 2005/03/30 19:50:29 roberto Exp roberto $
3** Lua stand-alone interpreter 3** Lua stand-alone interpreter
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -102,15 +102,14 @@ static void print_version (void) {
102} 102}
103 103
104 104
105static int getargs (lua_State *L, char *argv[], int n) { 105static int getargs (lua_State *L, int argc, char **argv, int n) {
106 int i, narg; 106 int narg = argc - (n + 1); /* number of arguments to the script */
107 for (i=n+1; argv[i]; i++) { 107 int i;
108 luaL_checkstack(L, 1, "too many arguments to script"); 108 luaL_checkstack(L, narg + 3, "too many arguments to script");
109 for (i=n+1; i < argc; i++)
109 lua_pushstring(L, argv[i]); 110 lua_pushstring(L, argv[i]);
110 }
111 narg = i-(n+1); /* number of arguments to the script (not to `lua.c') */
112 lua_newtable(L); 111 lua_newtable(L);
113 for (i=0; argv[i]; i++) { 112 for (i=0; i < argc; i++) {
114 lua_pushstring(L, argv[i]); 113 lua_pushstring(L, argv[i]);
115 lua_rawseti(L, -2, i - n); 114 lua_rawseti(L, -2, i - n);
116 } 115 }
@@ -230,7 +229,7 @@ static int checkvar (lua_State *L) {
230 229
231#define clearinteractive(i) (*i &= 2) 230#define clearinteractive(i) (*i &= 2)
232 231
233static int handle_argv (lua_State *L, char *argv[], int *interactive) { 232static int handle_argv (lua_State *L, int argc, char **argv, int *interactive) {
234 if (argv[1] == NULL) { /* no arguments? */ 233 if (argv[1] == NULL) { /* no arguments? */
235 *interactive = 0; 234 *interactive = 0;
236 if (lua_stdin_is_tty()) 235 if (lua_stdin_is_tty())
@@ -303,9 +302,9 @@ static int handle_argv (lua_State *L, char *argv[], int *interactive) {
303 } 302 }
304 } endloop: 303 } endloop:
305 if (argv[i] != NULL) { 304 if (argv[i] != NULL) {
306 const char *filename = argv[i];
307 int narg = getargs(L, argv, i); /* collect arguments */
308 int status; 305 int status;
306 const char *filename = argv[i];
307 int narg = getargs(L, argc, argv, i); /* collect arguments */
309 lua_setglobal(L, "arg"); 308 lua_setglobal(L, "arg");
310 clearinteractive(interactive); 309 clearinteractive(interactive);
311 status = luaL_loadfile(L, filename); 310 status = luaL_loadfile(L, filename);
@@ -347,7 +346,7 @@ static int pmain (lua_State *L) {
347 luaopen_stdlibs(L); /* open libraries */ 346 luaopen_stdlibs(L); /* open libraries */
348 status = handle_luainit(L); 347 status = handle_luainit(L);
349 if (status == 0) { 348 if (status == 0) {
350 status = handle_argv(L, s->argv, &interactive); 349 status = handle_argv(L, s->argc, s->argv, &interactive);
351 if (status == 0 && interactive) dotty(L); 350 if (status == 0 && interactive) dotty(L);
352 } 351 }
353 s->status = status; 352 s->status = status;
@@ -355,7 +354,7 @@ static int pmain (lua_State *L) {
355} 354}
356 355
357 356
358int main (int argc, char *argv[]) { 357int main (int argc, char **argv) {
359 int status; 358 int status;
360 struct Smain s; 359 struct Smain s;
361 lua_State *L = lua_open(); /* create state */ 360 lua_State *L = lua_open(); /* create state */