]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: lua: executes the function destroying the Lua session in safe mode
authorThierry FOURNIER <thierry.fournier@ozon.io>
Wed, 12 Jul 2017 11:41:33 +0000 (13:41 +0200)
committerWilly Tarreau <w@1wt.eu>
Tue, 18 Jul 2017 04:41:28 +0000 (06:41 +0200)
When we destroy the Lua session, we manipulates Lua stack,
so errors can raises. It will be better to catch these errors.

This patch should be backported in 1.6 and 1.7

src/hlua.c

index 408a9f26657ebb34520dc24f11be0fa6f357f02b..de4af39e1f166f9c6e47fc9146b61aa847df9e35 100644 (file)
@@ -882,9 +882,15 @@ void hlua_ctx_destroy(struct hlua *lua)
        /* Purge all the pending signals. */
        hlua_com_purge(&lua->com);
 
+       if (!SET_SAFE_LJMP(lua->T))
+               return;
        luaL_unref(lua->T, LUA_REGISTRYINDEX, lua->Mref);
-       luaL_unref(gL.T, LUA_REGISTRYINDEX, lua->Tref);
+       RESET_SAFE_LJMP(lua->T);
 
+       if (!SET_SAFE_LJMP(gL.T))
+               return;
+       luaL_unref(gL.T, LUA_REGISTRYINDEX, lua->Tref);
+       RESET_SAFE_LJMP(gL.T);
        /* Forces a garbage collecting process. If the Lua program is finished
         * without error, we run the GC on the thread pointer. Its freed all
         * the unused memory.
@@ -895,9 +901,16 @@ void hlua_ctx_destroy(struct hlua *lua)
         * the garbage collection.
         */
        if (lua->flags & HLUA_MUST_GC) {
+               if (!SET_SAFE_LJMP(lua->T))
+                       return;
                lua_gc(lua->T, LUA_GCCOLLECT, 0);
-               if (lua_status(lua->T) != LUA_OK)
+               RESET_SAFE_LJMP(lua->T);
+               if (lua_status(lua->T) != LUA_OK) {
+                       if (!SET_SAFE_LJMP(gL.T))
+                               return;
                        lua_gc(gL.T, LUA_GCCOLLECT, 0);
+                       RESET_SAFE_LJMP(gL.T);
+               }
        }
 
        lua->T = NULL;