mirror of https://github.com/rusefi/lua.git
LUAI_MAXCSTACK must be smaller than -LUA_REGISTRYINDEX +
coroutine.resume pushes element without ensuring stack size
This commit is contained in:
parent
aec671c126
commit
3b5b14a085
55
bugs
55
bugs
|
@ -1645,7 +1645,7 @@ a = coroutine.create(function() yield() end)
|
|||
coroutine.resume(a)
|
||||
debug.sethook(a) -- may overflow the stack of 'a'
|
||||
]],
|
||||
patch = [[ ]],
|
||||
patch = [[
|
||||
ldblib.c:
|
||||
@@ -268,12 +268,11 @@
|
||||
count = luaL_optint(L, arg+3, 0);
|
||||
|
@ -1680,6 +1680,59 @@ ldblib.c:
|
|||
}
|
||||
lua_pushstring(L, unmakemask(mask, buff));
|
||||
lua_pushinteger(L, lua_gethookcount(L1));
|
||||
]]
|
||||
}
|
||||
|
||||
|
||||
|
||||
-----------------------------------------------------------------
|
||||
-- Lua 5.1.3
|
||||
|
||||
Bug{
|
||||
what = [[LUAI_MAXCSTACK must be smaller than -LUA_REGISTRYINDEX]],
|
||||
report = [[Patrick Donnell, on 2008/02/11]],
|
||||
since = [[5.1.3]],
|
||||
example = [[
|
||||
j = 1e4
|
||||
co = coroutine.create(function()
|
||||
t = {}
|
||||
for i = 1, j do t[i] = i end
|
||||
return unpack(t)
|
||||
end)
|
||||
print(coroutine.resume(co))
|
||||
]],
|
||||
patch = [[
|
||||
luaconf.h:
|
||||
443c443,444
|
||||
< ** functions to consume unlimited stack space.
|
||||
---
|
||||
> ** functions to consume unlimited stack space. (must be smaller than
|
||||
> ** -LUA_REGISTRYINDEX)
|
||||
445,446c446
|
||||
< #define LUAI_MCS_AUX ((int)(INT_MAX / (4*sizeof(LUA_NUMBER))))
|
||||
< #define LUAI_MAXCSTACK (LUAI_MCS_AUX > SHRT_MAX ? SHRT_MAX : LUAI_MCS_AUX)
|
||||
---
|
||||
> #define LUAI_MAXCSTACK 8000
|
||||
]],
|
||||
}
|
||||
|
||||
Bug{
|
||||
what = [[coroutine.resume pushes element without ensuring stack size]],
|
||||
report = [[on 2008/02/11]],
|
||||
since = [[5.0]],
|
||||
example = [[(this bug cannot be detected without internal assertions)]],
|
||||
patch = [[
|
||||
lbaselib.c:
|
||||
@@ -526,7 +526,7 @@
|
||||
status = lua_resume(co, narg);
|
||||
if (status == 0 || status == LUA_YIELD) {
|
||||
int nres = lua_gettop(co);
|
||||
- if (!lua_checkstack(L, nres))
|
||||
+ if (!lua_checkstack(L, nres + 1))
|
||||
luaL_error(L, "too many results to resume");
|
||||
lua_xmove(co, L, nres); /* move yielded values */
|
||||
return nres;
|
||||
]],
|
||||
}
|
||||
|
||||
Bug{
|
||||
|
|
Loading…
Reference in New Issue