]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
store debug.traceback function before user can hide it from us 16229/head
authorPeter van Dijk <peter.van.dijk@powerdns.com>
Thu, 9 Oct 2025 11:22:54 +0000 (13:22 +0200)
committerPeter van Dijk <peter.van.dijk@powerdns.com>
Tue, 21 Oct 2025 17:25:14 +0000 (19:25 +0200)
Signed-off-by: Peter van Dijk <peter.van.dijk@powerdns.com>
ext/luawrapper/include/LuaContext.hpp
regression-tests.dnsdist/test_Lua.py

index b7de2c1c4379f1bef3600a3fc0d388208a36c43b..71d25d06151e4041259706ddee7ebd667bc4d55d 100644 (file)
@@ -67,6 +67,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #endif
 
 #define LUACONTEXT_GLOBAL_EQ "e5ddced079fc405aa4937b386ca387d2"
+#define LUACONTEXT_DEBUG_TRACEBACK "8d143f0add7ad7fa323d0d1d12f3f114" // I would prefer a lightuserdata in the registry index
 #define EQ_FUNCTION_NAME "__eq"
 #define TOSTRING_FUNCTION_NAME "__tostring"
 
@@ -113,7 +114,12 @@ public:
         if (openDefaultLibs)
             luaL_openlibs(mState);
 
-         writeGlobalEq();
+        writeGlobalEq();
+        lua_pushliteral(mState, LUACONTEXT_DEBUG_TRACEBACK); // ref
+        lua_getglobal(mState, "debug"); // ref, debug
+        lua_getfield(mState, -1, "traceback"); // ref, debug, traceback
+        lua_remove(mState, -2); // ref, traceback
+        lua_settable(mState, LUA_REGISTRYINDEX); // []
     }
 
     void writeGlobalEq() {
@@ -1418,9 +1424,8 @@ private:
     }
     
     static int gettraceback(lua_State* L) {
-        lua_getglobal(L, "debug"); // stack: error, debug library
-        lua_getfield(L, -1, "traceback"); // stack: error, debug library, debug.traceback function
-        lua_remove(L, -2); // stack: error, debug.traceback function
+        lua_pushliteral(L, LUACONTEXT_DEBUG_TRACEBACK); // stack: error, ref
+        lua_rawget(L, LUA_REGISTRYINDEX); // stack: error, debug.traceback
         lua_pushstring(L, ""); // stack: error, debug.traceback, ""
         lua_pushinteger(L, 2); // stack: error, debug.traceback, "", 2
         lua_call(L, 2, 1); // stack: error, traceback
index d81054f2b381caf753f27781ad480b14c1d23c41..dc2372fd07d4d013b39714432de3b4f7b609c6e3 100644 (file)
@@ -184,3 +184,22 @@ class TestLuaPoolBindings(DNSDistTest):
             sender = getattr(self, method)
             (_, receivedResponse) = sender(query, response=response)
             self.assertEqual(receivedResponse, response)
+
+class TestLuaError(DNSDistTest):
+    _consoleKey = DNSDistTest.generateConsoleKey()
+    _consoleKeyB64 = base64.b64encode(_consoleKey).decode('ascii')
+
+    _config_params = ['_consoleKeyB64', '_consolePort']
+    _config_template = """
+    setKey("%s")
+    controlSocket("127.0.0.1:%s")
+
+    debug = nil
+    """
+
+    def testLuaError(self):
+        """
+        LuaError: Test exception handling while debug module is obscured
+        """
+        res = self.sendConsoleCommand('error("expected" .. " " .. "error")')
+        self.assertIn('expected error', res)