From 5bff2aaf473e06b884846125ea6f5a718e2177bc Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Wed, 15 Jul 2009 14:35:20 -0300 Subject: [PATCH] calls with LUA_MULTRET may leave no free slots in the stack --- lbaselib.c | 4 +++- lua.c | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lbaselib.c b/lbaselib.c index bd53a38d..96e26a9a 100644 --- a/lbaselib.c +++ b/lbaselib.c @@ -1,5 +1,5 @@ /* -** $Id: lbaselib.c,v 1.215 2009/04/08 18:04:33 roberto Exp roberto $ +** $Id: lbaselib.c,v 1.216 2009/07/08 16:06:07 roberto Exp roberto $ ** Basic library ** See Copyright Notice in lua.h */ @@ -419,6 +419,7 @@ static int luaB_pcall (lua_State *L) { int status; luaL_checkany(L, 1); status = lua_pcallk(L, lua_gettop(L) - 1, LUA_MULTRET, 0, 0, pcallcont); + luaL_checkstack(L, 1, NULL); lua_pushboolean(L, (status == LUA_OK)); lua_insert(L, 1); return lua_gettop(L); /* return status + all results */ @@ -434,6 +435,7 @@ static int luaB_xpcall (lua_State *L) { lua_replace(L, 1); lua_replace(L, 2); status = lua_pcallk(L, n - 2, LUA_MULTRET, 1, 1, pcallcont); + luaL_checkstack(L, 1, NULL); lua_pushboolean(L, (status == LUA_OK)); lua_replace(L, 1); return lua_gettop(L); /* return status + all results */ diff --git a/lua.c b/lua.c index 2c456cc1..1885364f 100644 --- a/lua.c +++ b/lua.c @@ -1,5 +1,5 @@ /* -** $Id: lua.c,v 1.172 2009/02/19 17:15:35 roberto Exp roberto $ +** $Id: lua.c,v 1.173 2009/06/18 18:59:58 roberto Exp roberto $ ** Lua stand-alone interpreter ** See Copyright Notice in lua.h */ @@ -218,6 +218,7 @@ static void dotty (lua_State *L) { if (status == LUA_OK) status = docall(L, 0, 0); report(L, status); if (status == LUA_OK && lua_gettop(L) > 0) { /* any result to print? */ + luaL_checkstack(L, LUA_MINSTACK, "too many results to print"); lua_getglobal(L, "print"); lua_insert(L, 1); if (lua_pcall(L, lua_gettop(L)-1, 0, 0) != LUA_OK)