Ver código fonte

debug.sethook/gethook may overflow the thread's stack

Roberto Ierusalimschy 17 anos atrás
pai
commit
3a515df086
1 arquivos alterados com 46 adições e 0 exclusões
  1. 46 0
      bugs

+ 46 - 0
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 ]],