diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2007-07-31 16:39:52 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2007-07-31 16:39:52 -0300 |
| commit | f6a81dbe9770f0e64d04b4e7be17c826d53253aa (patch) | |
| tree | b793122f3eeff25b2b7146d9261c79b66f152a1f /lparser.c | |
| parent | 3904a66ab0ea441504afb74160fb6ff5efd8d33b (diff) | |
| download | lua-f6a81dbe9770f0e64d04b4e7be17c826d53253aa.tar.gz lua-f6a81dbe9770f0e64d04b4e7be17c826d53253aa.tar.bz2 lua-f6a81dbe9770f0e64d04b4e7be17c826d53253aa.zip | |
BUG: too many variables in an assignment may cause a C stack overflow
Diffstat (limited to 'lparser.c')
| -rw-r--r-- | lparser.c | 8 |
1 files changed, 5 insertions, 3 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lparser.c,v 2.52 2007/03/27 14:11:38 roberto Exp roberto $ | 2 | ** $Id: lparser.c,v 2.53 2007/05/11 17:28:56 roberto Exp roberto $ |
| 3 | ** Lua Parser | 3 | ** Lua Parser |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -73,8 +73,8 @@ static void errorlimit (FuncState *fs, int limit, const char *what) { | |||
| 73 | const char *where = (fs->f->linedefined == 0) ? | 73 | const char *where = (fs->f->linedefined == 0) ? |
| 74 | "main function" : | 74 | "main function" : |
| 75 | luaO_pushfstring(fs->L, "function at line %d", fs->f->linedefined); | 75 | luaO_pushfstring(fs->L, "function at line %d", fs->f->linedefined); |
| 76 | msg = luaO_pushfstring(fs->L, "too many %s in %s (limit is %d)", | 76 | msg = luaO_pushfstring(fs->L, "too many %s (limit is %d) in %s", |
| 77 | what, where, limit); | 77 | what, limit, where); |
| 78 | luaX_lexerror(fs->ls, msg, fs->ls->t.token); | 78 | luaX_lexerror(fs->ls, msg, fs->ls->t.token); |
| 79 | } | 79 | } |
| 80 | 80 | ||
| @@ -946,6 +946,8 @@ static void assignment (LexState *ls, struct LHS_assign *lh, int nvars) { | |||
| 946 | primaryexp(ls, &nv.v); | 946 | primaryexp(ls, &nv.v); |
| 947 | if (nv.v.k == VLOCAL) | 947 | if (nv.v.k == VLOCAL) |
| 948 | check_conflict(ls, lh, &nv.v); | 948 | check_conflict(ls, lh, &nv.v); |
| 949 | luaY_checklimit(ls->fs, nvars, LUAI_MAXCCALLS - G(ls->L)->nCcalls, | ||
| 950 | "variable names"); | ||
| 949 | assignment(ls, &nv, nvars+1); | 951 | assignment(ls, &nv, nvars+1); |
| 950 | } | 952 | } |
| 951 | else { /* assignment -> `=' explist1 */ | 953 | else { /* assignment -> `=' explist1 */ |
