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);
}
}
}
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 */
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);
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);
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);
}
}
+ 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,
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 */
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)
Packet *LuaStateGetPacket(lua_State *luastate);
void *LuaStateGetTX(lua_State *luastate);
+uint64_t LuaStateGetTxId(lua_State *luastate);
/** \brief get flow pointer from lua state
*
/* 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
*