]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
lua: store id with tx ptr
authorVictor Julien <victor@inliniac.net>
Thu, 10 Jun 2021 17:55:38 +0000 (19:55 +0200)
committerVictor Julien <vjulien@oisf.net>
Fri, 30 Sep 2022 07:46:05 +0000 (09:46 +0200)
src/detect-lua-extensions.c
src/output-lua.c
src/util-lua-common.c
src/util-lua.c
src/util-lua.h

index 69f6ae459036a6c67f5da9b0a873de9a57054d10..897b0874021ae34a8f0b0c097176971d8118f3d5 100644 (file)
@@ -525,7 +525,7 @@ void LuaExtensionsMatchSetup(lua_State *lua_state, DetectLuaData *ld,
         if (f && f->alstate) {
             void *txptr = AppLayerParserGetTx(f->proto, f->alproto, f->alstate, det_ctx->tx_id);
             if (txptr) {
-                LuaStateSetTX(lua_state, txptr);
+                LuaStateSetTX(lua_state, txptr, det_ctx->tx_id);
             }
         }
     }
index 01ef5a5ac32d4bb53fc1d92f439a86a8b712f408..8a42a0387b5b26d16ea0104c02a7b56a6ef7a537 100644 (file)
@@ -107,7 +107,7 @@ static int LuaTxLogger(ThreadVars *tv, void *thread_data, const Packet *p, Flow
 
     LuaStateSetThreadVars(td->lua_ctx->luastate, tv);
     LuaStateSetPacket(td->lua_ctx->luastate, (Packet *)p);
-    LuaStateSetTX(td->lua_ctx->luastate, txptr);
+    LuaStateSetTX(td->lua_ctx->luastate, txptr, tx_id);
     LuaStateSetFlow(td->lua_ctx->luastate, f);
 
     /* prepare data to pass to script */
@@ -151,7 +151,7 @@ static int LuaStreamingLogger(ThreadVars *tv, void *thread_data, const Flow *f,
 
     LuaStateSetThreadVars(td->lua_ctx->luastate, tv);
     if (flags & OUTPUT_STREAMING_FLAG_TRANSACTION)
-        LuaStateSetTX(td->lua_ctx->luastate, txptr);
+        LuaStateSetTX(td->lua_ctx->luastate, txptr, tx_id);
     LuaStateSetFlow(td->lua_ctx->luastate, (Flow *)f);
     LuaStateSetStreamingBuffer(td->lua_ctx->luastate, &b);
 
@@ -212,7 +212,7 @@ static int LuaPacketLoggerAlerts(ThreadVars *tv, void *thread_data, const Packet
 
         LuaStateSetThreadVars(td->lua_ctx->luastate, tv);
         LuaStateSetPacket(td->lua_ctx->luastate, (Packet *)p);
-        LuaStateSetTX(td->lua_ctx->luastate, txptr);
+        LuaStateSetTX(td->lua_ctx->luastate, txptr, pa->tx_id);
         LuaStateSetFlow(td->lua_ctx->luastate, p->flow);
         LuaStateSetPacketAlert(td->lua_ctx->luastate, (PacketAlert *)pa);
 
@@ -310,7 +310,7 @@ static int LuaFileLogger(ThreadVars *tv, void *thread_data, const Packet *p, con
     if (p->flow && p->flow->alstate) {
         void *txptr = AppLayerParserGetTx(p->proto, p->flow->alproto, p->flow->alstate, ff->txid);
         if (txptr) {
-            LuaStateSetTX(td->lua_ctx->luastate, txptr);
+            LuaStateSetTX(td->lua_ctx->luastate, txptr, ff->txid);
         }
     }
     LuaStateSetFlow(td->lua_ctx->luastate, p->flow);
index b5f2364fab93af3f111b199a94672cfdd5a23956..228aeffcdd4a6e578de567346a3481ce626c54e5 100644 (file)
@@ -820,8 +820,9 @@ static int LuaCallbackFileInfoPushToStackFromFile(lua_State *luastate, const Fil
         }
     }
 
+    lua_Integer tx_id = LuaStateGetTxId(luastate);
     lua_pushinteger(luastate, file->file_store_id);
-    lua_pushinteger(luastate, file->txid);
+    lua_pushinteger(luastate, tx_id);
     lua_pushlstring(luastate, (char *)file->name, file->name_len);
     lua_pushinteger(luastate, FileTrackedSize(file));
     lua_pushstring (luastate,
index dcad36403eea8c02d2d16fda7a24603c7b26ebb6..9e65c3017fcb712ae0cdf4c5e6ce8197b6c00361 100644 (file)
@@ -86,6 +86,8 @@ void LuaReturnState(lua_State *s)
 const char lua_ext_key_tv[] = "suricata:lua:tv:ptr";
 /* key for tx pointer */
 const char lua_ext_key_tx[] = "suricata:lua:tx:ptr";
+/* key for tx id */
+const char lua_ext_key_tx_id[] = "suricata:lua:tx_id";
 /* key for p (packet) pointer */
 const char lua_ext_key_p[] = "suricata:lua:pkt:ptr";
 /* key for f (flow) pointer */
@@ -147,11 +149,23 @@ void *LuaStateGetTX(lua_State *luastate)
     return tx;
 }
 
-void LuaStateSetTX(lua_State *luastate, void *txptr)
+/** \brief get tx id from the lua state */
+uint64_t LuaStateGetTxId(lua_State *luastate)
+{
+    lua_pushlightuserdata(luastate, (void *)&lua_ext_key_tx_id);
+    lua_gettable(luastate, LUA_REGISTRYINDEX);
+    uint64_t tx_id = lua_tointeger(luastate, -1);
+    return tx_id;
+}
+void LuaStateSetTX(lua_State *luastate, void *txptr, const uint64_t tx_id)
 {
     lua_pushlightuserdata(luastate, (void *)&lua_ext_key_tx);
     lua_pushlightuserdata(luastate, (void *)txptr);
     lua_settable(luastate, LUA_REGISTRYINDEX);
+
+    lua_pushlightuserdata(luastate, (void *)&lua_ext_key_tx_id);
+    lua_pushinteger(luastate, tx_id);
+    lua_settable(luastate, LUA_REGISTRYINDEX);
 }
 
 Flow *LuaStateGetFlow(lua_State *luastate)
index ab571d8b29d00b0ce4db1dd051a76bce9aced52e..019f254ae91ee55c36c24df54e83fb2d77c1e186 100644 (file)
@@ -53,6 +53,7 @@ ThreadVars *LuaStateGetThreadVars(lua_State *luastate);
 
 Packet *LuaStateGetPacket(lua_State *luastate);
 void *LuaStateGetTX(lua_State *luastate);
+uint64_t LuaStateGetTxId(lua_State *luastate);
 
 /** \brief get flow pointer from lua state
  *
@@ -77,7 +78,7 @@ int LuaStateGetDirection(lua_State *luastate);
 /* sets */
 
 void LuaStateSetPacket(lua_State *luastate, Packet *p);
-void LuaStateSetTX(lua_State *luastate, void *tx);
+void LuaStateSetTX(lua_State *luastate, void *tx, const uint64_t tx_id);
 
 /** \brief set a flow pointer in the lua state
  *