From bdbaaa3b24762dc2feb72a1eb8c1422ae4b42fc7 Mon Sep 17 00:00:00 2001 From: Victor Julien Date: Thu, 10 Jun 2021 19:55:38 +0200 Subject: [PATCH] lua: store id with tx ptr --- src/detect-lua-extensions.c | 2 +- src/output-lua.c | 8 ++++---- src/util-lua-common.c | 3 ++- src/util-lua.c | 16 +++++++++++++++- src/util-lua.h | 3 ++- 5 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/detect-lua-extensions.c b/src/detect-lua-extensions.c index 69f6ae4590..897b087402 100644 --- a/src/detect-lua-extensions.c +++ b/src/detect-lua-extensions.c @@ -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); } } } diff --git a/src/output-lua.c b/src/output-lua.c index 01ef5a5ac3..8a42a0387b 100644 --- a/src/output-lua.c +++ b/src/output-lua.c @@ -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); diff --git a/src/util-lua-common.c b/src/util-lua-common.c index b5f2364fab..228aeffcdd 100644 --- a/src/util-lua-common.c +++ b/src/util-lua-common.c @@ -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, diff --git a/src/util-lua.c b/src/util-lua.c index dcad36403e..9e65c3017f 100644 --- a/src/util-lua.c +++ b/src/util-lua.c @@ -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) diff --git a/src/util-lua.h b/src/util-lua.h index ab571d8b29..019f254ae9 100644 --- a/src/util-lua.h +++ b/src/util-lua.h @@ -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 *