Browse Source

Corrected bug in 'luaD_tryfuncTM'

The pointer to the metamethod can be invalidated by a finalizer that
can run during a GC in 'checkstackGCp'. (This commit also fixes a
detail in the manual.) Bug introduced in commit 91673a8ec.
Roberto Ierusalimschy 3 years ago
parent
commit
6b3e116d44
2 changed files with 3 additions and 2 deletions
  1. 2 1
      ldo.c
  2. 1 1
      manual/manual.of

+ 2 - 1
ldo.c

@@ -388,9 +388,10 @@ static void rethook (lua_State *L, CallInfo *ci, int nres) {
 ** an error if there is no '__call' metafield.
 */
 StkId luaD_tryfuncTM (lua_State *L, StkId func) {
-  const TValue *tm = luaT_gettmbyobj(L, s2v(func), TM_CALL);
+  const TValue *tm;
   StkId p;
   checkstackGCp(L, 1, func);  /* space for metamethod */
+  tm = luaT_gettmbyobj(L, s2v(func), TM_CALL);  /* (after previous GC) */
   if (l_unlikely(ttisnil(tm)))
     luaG_callerror(L, s2v(func));  /* nothing to call */
   for (p = L->top; p > func; p--)  /* open space for metamethod */

+ 1 - 1
manual/manual.of

@@ -6247,7 +6247,7 @@ to its caller.
 }
 
 @LibEntry{error (message [, level])|
-Raises an error @see{error} with @{message} as the error object.
+Raises an error @see{error} with @id{message} as the error object.
 This function never returns.
 
 Usually, @id{error} adds some information about the error position