[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: Stack overflow in luaO_pushvfstring
- From: Andrew Gierth <andrew@...>
- Date: Tue, 07 Jul 2020 01:43:19 +0100
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.