diff --git a/bugs b/bugs index a9f53823..1c8de3fc 100644 --- a/bugs +++ b/bugs @@ -1013,3 +1013,35 @@ patch = [[ ]], } + +Bug{ +what = [[list constructors have wrong limit]], + +report = [[by Norman Ramsey, June 2006]], + +since = "Lua 5.1", + +example = [[ +a = {} +a[1] = "x={1" +for i = 2, 2^20 do + a[i] = 1 +end +a[#a + 1] = "}" +s = table.concat(a, ",") +assert(loadstring(s))() +print(#x) +]], + +patch = [[ +* lparser.c: + static void listfield (LexState *ls, struct ConsControl *cc) { + expr(ls, &cc->v); +- luaY_checklimit(ls->fs, cc->na, MAXARG_Bx, "items in a constructor"); ++ luaY_checklimit(ls->fs, cc->na, MAX_INT, "items in a constructor"); + cc->na++; + cc->tostore++; + } +]], + +} diff --git a/lparser.c b/lparser.c index 07511fdf..349cfd10 100644 --- a/lparser.c +++ b/lparser.c @@ -1,5 +1,5 @@ /* -** $Id: lparser.c,v 2.43 2006/06/22 16:12:59 roberto Exp roberto $ +** $Id: lparser.c,v 2.44 2006/07/11 15:53:29 roberto Exp roberto $ ** Lua Parser ** See Copyright Notice in lua.h */ @@ -495,7 +495,7 @@ static void lastlistfield (FuncState *fs, struct ConsControl *cc) { static void listfield (LexState *ls, struct ConsControl *cc) { expr(ls, &cc->v); - luaY_checklimit(ls->fs, cc->na, MAXARG_Bx, "items in a constructor"); + luaY_checklimit(ls->fs, cc->na, MAX_INT, "items in a constructor"); cc->na++; cc->tostore++; }