lua-users home
lua-l archive

Re: Stack overflow in luaO_pushvfstring

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


Here is a module that might be of some use when testing these things.
Compile as usual for a loadable C module and:
 lua -l stackchk -e 'print(stackchk())'
should print the size of the stack frame for lua->lua calls in bytes. On
versions other than 5.4 this should return 0, since previously the C
stack wasn't used for such calls; on amd64 with clang -O2 I get a value
of 224.
I'm curious to know what kind of values people get on other
compilers/platforms.
/* stackchk.c */
#include <stddef.h>
#include <string.h>
#include <math.h>
#include <lua.h>
#include <lauxlib.h>
/* note, must avoid tail calls in r() */
static const char *stack_code =
 "local _ENV, f = nil, ...\n"
 "local function r(d)\n"
 " if d >= 0 then return r(d-1),d else return f(),0 end\n"
 "end\n"
 "return r\n";
static int getdepth(lua_State *L)
{
 volatile int t = 0;
 lua_pushlightuserdata(L, (void*) &t);
 return 1;
}
static int stackchk(lua_State *L)
{
 int i, n = luaL_optinteger(L, 1, 50);
 void *p[2];
 for (i = 0; i < 2; ++i) {
 lua_pushvalue(L, lua_upvalueindex(1));
 lua_pushinteger(L, (i*n));
 lua_call(L, 1, 1);
 p[i] = lua_touserdata(L, -1);
 }
 lua_pushnumber(L, fabs((double)(p[0] - p[1])) / n);
 return 1;
}
int luaopen_stackchk(lua_State *L)
{
 if (luaL_loadbufferx(L, stack_code, strlen(stack_code), "stackchk", "t"))
 lua_error(L);
 lua_pushcfunction(L, getdepth);
 lua_call(L, 1, 1);
 lua_pushcclosure(L, stackchk, 1);
 return 1;
}
/* end */
-- 
Andrew.

AltStyle によって変換されたページ (->オリジナル) /