lua: store id with tx ptr

pull/7954/head
Victor Julien 4 years ago committed by Victor Julien
parent db5cf1f8f9
commit bdbaaa3b24

@ -525,7 +525,7 @@ void LuaExtensionsMatchSetup(lua_State *lua_state, DetectLuaData *ld,
if (f && f->alstate) { if (f && f->alstate) {
void *txptr = AppLayerParserGetTx(f->proto, f->alproto, f->alstate, det_ctx->tx_id); void *txptr = AppLayerParserGetTx(f->proto, f->alproto, f->alstate, det_ctx->tx_id);
if (txptr) { if (txptr) {
LuaStateSetTX(lua_state, txptr); LuaStateSetTX(lua_state, txptr, det_ctx->tx_id);
} }
} }
} }

@ -107,7 +107,7 @@ static int LuaTxLogger(ThreadVars *tv, void *thread_data, const Packet *p, Flow
LuaStateSetThreadVars(td->lua_ctx->luastate, tv); LuaStateSetThreadVars(td->lua_ctx->luastate, tv);
LuaStateSetPacket(td->lua_ctx->luastate, (Packet *)p); 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); LuaStateSetFlow(td->lua_ctx->luastate, f);
/* prepare data to pass to script */ /* 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); LuaStateSetThreadVars(td->lua_ctx->luastate, tv);
if (flags & OUTPUT_STREAMING_FLAG_TRANSACTION) 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); LuaStateSetFlow(td->lua_ctx->luastate, (Flow *)f);
LuaStateSetStreamingBuffer(td->lua_ctx->luastate, &b); 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); LuaStateSetThreadVars(td->lua_ctx->luastate, tv);
LuaStateSetPacket(td->lua_ctx->luastate, (Packet *)p); 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); LuaStateSetFlow(td->lua_ctx->luastate, p->flow);
LuaStateSetPacketAlert(td->lua_ctx->luastate, (PacketAlert *)pa); 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) { if (p->flow && p->flow->alstate) {
void *txptr = AppLayerParserGetTx(p->proto, p->flow->alproto, p->flow->alstate, ff->txid); void *txptr = AppLayerParserGetTx(p->proto, p->flow->alproto, p->flow->alstate, ff->txid);
if (txptr) { if (txptr) {
LuaStateSetTX(td->lua_ctx->luastate, txptr); LuaStateSetTX(td->lua_ctx->luastate, txptr, ff->txid);
} }
} }
LuaStateSetFlow(td->lua_ctx->luastate, p->flow); LuaStateSetFlow(td->lua_ctx->luastate, p->flow);

@ -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->file_store_id);
lua_pushinteger(luastate, file->txid); lua_pushinteger(luastate, tx_id);
lua_pushlstring(luastate, (char *)file->name, file->name_len); lua_pushlstring(luastate, (char *)file->name, file->name_len);
lua_pushinteger(luastate, FileTrackedSize(file)); lua_pushinteger(luastate, FileTrackedSize(file));
lua_pushstring (luastate, lua_pushstring (luastate,

@ -86,6 +86,8 @@ void LuaReturnState(lua_State *s)
const char lua_ext_key_tv[] = "suricata:lua:tv:ptr"; const char lua_ext_key_tv[] = "suricata:lua:tv:ptr";
/* key for tx pointer */ /* key for tx pointer */
const char lua_ext_key_tx[] = "suricata:lua:tx:ptr"; 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 */ /* key for p (packet) pointer */
const char lua_ext_key_p[] = "suricata:lua:pkt:ptr"; const char lua_ext_key_p[] = "suricata:lua:pkt:ptr";
/* key for f (flow) pointer */ /* key for f (flow) pointer */
@ -147,11 +149,23 @@ void *LuaStateGetTX(lua_State *luastate)
return tx; 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 *)&lua_ext_key_tx);
lua_pushlightuserdata(luastate, (void *)txptr); lua_pushlightuserdata(luastate, (void *)txptr);
lua_settable(luastate, LUA_REGISTRYINDEX); 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) Flow *LuaStateGetFlow(lua_State *luastate)

@ -53,6 +53,7 @@ ThreadVars *LuaStateGetThreadVars(lua_State *luastate);
Packet *LuaStateGetPacket(lua_State *luastate); Packet *LuaStateGetPacket(lua_State *luastate);
void *LuaStateGetTX(lua_State *luastate); void *LuaStateGetTX(lua_State *luastate);
uint64_t LuaStateGetTxId(lua_State *luastate);
/** \brief get flow pointer from lua state /** \brief get flow pointer from lua state
* *
@ -77,7 +78,7 @@ int LuaStateGetDirection(lua_State *luastate);
/* sets */ /* sets */
void LuaStateSetPacket(lua_State *luastate, Packet *p); 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 /** \brief set a flow pointer in the lua state
* *

Loading…
Cancel
Save