mirror of https://github.com/lua/lua
debug.sethook/gethook may overflow the thread's stack
This commit is contained in:
parent
74897bc52f
commit
3a515df086
46
bugs
46
bugs
|
@ -1636,6 +1636,52 @@ lua.c:
|
|||
]],
|
||||
}
|
||||
|
||||
Bug{
|
||||
what = [[debug.sethook/gethook may overflow the thread's stack]],
|
||||
report = [[Ivko Stanilov, on 2008/01/04]],
|
||||
since = [[5.1]],
|
||||
example = [[
|
||||
a = coroutine.create(function() yield() end)
|
||||
coroutine.resume(a)
|
||||
debug.sethook(a) -- may overflow the stack of 'a'
|
||||
]],
|
||||
patch = [[ ]],
|
||||
ldblib.c:
|
||||
@@ -268,12 +268,11 @@
|
||||
count = luaL_optint(L, arg+3, 0);
|
||||
func = hookf; mask = makemask(smask, count);
|
||||
}
|
||||
- gethooktable(L1);
|
||||
- lua_pushlightuserdata(L1, L1);
|
||||
+ gethooktable(L);
|
||||
+ lua_pushlightuserdata(L, L1);
|
||||
lua_pushvalue(L, arg+1);
|
||||
- lua_xmove(L, L1, 1);
|
||||
- lua_rawset(L1, -3); /* set new hook */
|
||||
- lua_pop(L1, 1); /* remove hook table */
|
||||
+ lua_rawset(L, -3); /* set new hook */
|
||||
+ lua_pop(L, 1); /* remove hook table */
|
||||
lua_sethook(L1, func, mask, count); /* set hooks */
|
||||
return 0;
|
||||
}
|
||||
@@ -288,11 +287,10 @@
|
||||
if (hook != NULL && hook != hookf) /* external hook? */
|
||||
lua_pushliteral(L, "external hook");
|
||||
else {
|
||||
- gethooktable(L1);
|
||||
- lua_pushlightuserdata(L1, L1);
|
||||
- lua_rawget(L1, -2); /* get hook */
|
||||
- lua_remove(L1, -2); /* remove hook table */
|
||||
- lua_xmove(L1, L, 1);
|
||||
+ gethooktable(L);
|
||||
+ lua_pushlightuserdata(L, L1);
|
||||
+ lua_rawget(L, -2); /* get hook */
|
||||
+ lua_remove(L, -2); /* remove hook table */
|
||||
}
|
||||
lua_pushstring(L, unmakemask(mask, buff));
|
||||
lua_pushinteger(L, lua_gethookcount(L1));
|
||||
}
|
||||
|
||||
Bug{
|
||||
what = [[ ]],
|
||||
report = [[ , on ]],
|
||||
|
|
Loading…
Reference in New Issue