From c2ea18726a466fd3c84446eb002e060c04815521 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Fri, 19 Apr 2013 18:03:23 -0300 Subject: BUG: stack overflow in vararg functions with many fixed parameters called with few arguments --- ldo.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/ldo.c b/ldo.c index aafa3dca..d02e1132 100644 --- a/ldo.c +++ b/ldo.c @@ -1,5 +1,5 @@ /* -** $Id: ldo.c,v 2.108 2012/10/01 14:05:04 roberto Exp $ +** $Id: ldo.c,v 2.108.1.1 2013/04/12 18:48:47 roberto Exp roberto $ ** Stack and Call structure of Lua ** See Copyright Notice in lua.h */ @@ -260,6 +260,7 @@ static StkId adjust_varargs (lua_State *L, Proto *p, int actual) { StkId base, fixed; lua_assert(actual >= nfixargs); /* move fixed parameters to final position */ + luaD_checkstack(L, p->maxstacksize); /* check again for new 'base' */ fixed = L->top - actual; /* first fixed argument */ base = L->top; /* final position of first argument */ for (i=0; ip; - luaD_checkstack(L, p->maxstacksize); - func = restorestack(L, funcr); n = cast_int(L->top - func) - 1; /* number of real arguments */ + luaD_checkstack(L, p->maxstacksize); for (; n < p->numparams; n++) setnilvalue(L->top++); /* complete missing arguments */ - base = (!p->is_vararg) ? func + 1 : adjust_varargs(L, p, n); + if (!p->is_vararg) { + func = restorestack(L, funcr); + base = func + 1; + } + else { + base = adjust_varargs(L, p, n); + func = restorestack(L, funcr); /* previous call can change stack */ + } ci = next_ci(L); /* now 'enter' new function */ ci->nresults = nresults; ci->func = func; -- cgit v1.2.3-55-g6feb