output-lua: clean up flow lock handling

pull/1112/head
Victor Julien 12 years ago
parent 19383fd428
commit cb69cee4d8

@ -54,6 +54,10 @@
#include "util-unittest-helper.h"
#include "util-profiling.h"
#ifdef HAVE_LUA
#include "util-lua.h"
#endif
/**
* \brief Run the actual payload match functions
*
@ -534,12 +538,12 @@ int DetectEngineContentInspection(DetectEngineCtx *de_ctx, DetectEngineThreadCtx
else if (sm->type == DETECT_LUAJIT) {
SCLogDebug("lua starting");
/* for flowvar gets and sets we need to know the flow's lock status */
int need_flow_lock = 0;
int flow_lock = LUA_FLOW_LOCKED_BY_PARENT;
if (inspection_mode <= DETECT_ENGINE_CONTENT_INSPECTION_MODE_STREAM)
need_flow_lock = 1;
flow_lock = LUA_FLOW_NOT_LOCKED_BY_PARENT;
if (DetectLuajitMatchBuffer(det_ctx, s, sm, buffer, buffer_len,
det_ctx->buffer_offset, f, need_flow_lock) != 1)
det_ctx->buffer_offset, f, flow_lock) != 1)
{
SCLogDebug("lua no_match");
goto no_match;

@ -72,7 +72,7 @@ static int LuajitGetFlowvar(lua_State *luastate)
Flow *f;
FlowVar *fv;
DetectLuajitData *ld;
int need_flow_lock = 0;
int flow_lock = 0;
/* need luajit data for id -> idx conversion */
lua_pushlightuserdata(luastate, (void *)&luaext_key_ld);
@ -86,7 +86,7 @@ static int LuajitGetFlowvar(lua_State *luastate)
}
/* need flow and lock hint */
f = LuaStateGetFlow(luastate, &need_flow_lock);
f = LuaStateGetFlow(luastate, &flow_lock);
if (f == NULL) {
lua_pushnil(luastate);
lua_pushstring(luastate, "no flow");
@ -113,12 +113,12 @@ static int LuajitGetFlowvar(lua_State *luastate)
}
/* lookup var */
if (need_flow_lock)
if (flow_lock == LUA_FLOW_NOT_LOCKED_BY_PARENT)
FLOWLOCK_RDLOCK(f);
fv = FlowVarGet(f, idx);
if (fv == NULL) {
if (need_flow_lock)
if (flow_lock == LUA_FLOW_NOT_LOCKED_BY_PARENT)
FLOWLOCK_UNLOCK(f);
lua_pushnil(luastate);
@ -140,7 +140,7 @@ static int LuajitGetFlowvar(lua_State *luastate)
memcpy(buf, fv->data.fv_str.value, fv->data.fv_str.value_len);
buf[fv->data.fv_str.value_len] = '\0';
if (need_flow_lock)
if (flow_lock == LUA_FLOW_NOT_LOCKED_BY_PARENT)
FLOWLOCK_UNLOCK(f);
/* return value through luastate, as a luastring */
@ -160,7 +160,7 @@ int LuajitSetFlowvar(lua_State *luastate)
uint8_t *buffer;
DetectEngineThreadCtx *det_ctx;
DetectLuajitData *ld;
int need_flow_lock = 0;
int flow_lock = 0;
/* need luajit data for id -> idx conversion */
lua_pushlightuserdata(luastate, (void *)&luaext_key_ld);
@ -185,7 +185,7 @@ int LuajitSetFlowvar(lua_State *luastate)
}
/* need flow and lock hint */
f = LuaStateGetFlow(luastate, &need_flow_lock);
f = LuaStateGetFlow(luastate, &flow_lock);
if (f == NULL) {
lua_pushnil(luastate);
lua_pushstring(luastate, "no flow");
@ -245,7 +245,7 @@ int LuajitSetFlowvar(lua_State *luastate)
memcpy(buffer, str, len);
buffer[len] = '\0';
if (need_flow_lock)
if (flow_lock == LUA_FLOW_NOT_LOCKED_BY_PARENT)
FlowVarAddStr(f, idx, buffer, len);
else
FlowVarAddStrNoLock(f, idx, buffer, len);
@ -262,7 +262,7 @@ static int LuajitGetFlowint(lua_State *luastate)
Flow *f;
FlowVar *fv;
DetectLuajitData *ld;
int need_flow_lock = 0;
int flow_lock = 0;
uint32_t number;
/* need luajit data for id -> idx conversion */
@ -277,7 +277,7 @@ static int LuajitGetFlowint(lua_State *luastate)
}
/* need flow and lock hint */
f = LuaStateGetFlow(luastate, &need_flow_lock);
f = LuaStateGetFlow(luastate, &flow_lock);
if (f == NULL) {
lua_pushnil(luastate);
lua_pushstring(luastate, "no flow");
@ -307,13 +307,13 @@ static int LuajitGetFlowint(lua_State *luastate)
}
/* lookup var */
if (need_flow_lock)
if (flow_lock == LUA_FLOW_NOT_LOCKED_BY_PARENT)
FLOWLOCK_RDLOCK(f);
fv = FlowVarGet(f, idx);
if (fv == NULL) {
SCLogDebug("fv NULL");
if (need_flow_lock)
if (flow_lock == LUA_FLOW_NOT_LOCKED_BY_PARENT)
FLOWLOCK_UNLOCK(f);
lua_pushnil(luastate);
@ -322,7 +322,7 @@ static int LuajitGetFlowint(lua_State *luastate)
}
number = fv->data.fv_int.value;
if (need_flow_lock)
if (flow_lock == LUA_FLOW_NOT_LOCKED_BY_PARENT)
FLOWLOCK_UNLOCK(f);
/* return value through luastate, as a luanumber */
@ -340,7 +340,7 @@ int LuajitSetFlowint(lua_State *luastate)
Flow *f;
DetectEngineThreadCtx *det_ctx;
DetectLuajitData *ld;
int need_flow_lock = 0;
int flow_lock = 0;
uint32_t number;
lua_Number luanumber;
@ -367,7 +367,7 @@ int LuajitSetFlowint(lua_State *luastate)
}
/* need flow and lock hint */
f = LuaStateGetFlow(luastate, &need_flow_lock);
f = LuaStateGetFlow(luastate, &flow_lock);
if (f == NULL) {
lua_pushnil(luastate);
lua_pushstring(luastate, "no flow");
@ -407,7 +407,7 @@ int LuajitSetFlowint(lua_State *luastate)
return 2;
}
if (need_flow_lock)
if (flow_lock == LUA_FLOW_NOT_LOCKED_BY_PARENT)
FlowVarAddInt(f, idx, number);
else
FlowVarAddIntNoLock(f, idx, number);
@ -423,7 +423,7 @@ static int LuajitIncrFlowint(lua_State *luastate)
Flow *f;
FlowVar *fv;
DetectLuajitData *ld;
int need_flow_lock = 0;
int flow_lock = 0;
uint32_t number;
/* need luajit data for id -> idx conversion */
@ -438,7 +438,7 @@ static int LuajitIncrFlowint(lua_State *luastate)
}
/* need flow and lock hint */
f = LuaStateGetFlow(luastate, &need_flow_lock);
f = LuaStateGetFlow(luastate, &flow_lock);
if (f == NULL) {
lua_pushnil(luastate);
lua_pushstring(luastate, "no flow");
@ -468,7 +468,7 @@ static int LuajitIncrFlowint(lua_State *luastate)
}
/* lookup var */
if (need_flow_lock)
if (flow_lock == LUA_FLOW_NOT_LOCKED_BY_PARENT)
FLOWLOCK_RDLOCK(f);
fv = FlowVarGet(f, idx);
@ -481,7 +481,7 @@ static int LuajitIncrFlowint(lua_State *luastate)
}
FlowVarAddIntNoLock(f, idx, number);
if (need_flow_lock)
if (flow_lock == LUA_FLOW_NOT_LOCKED_BY_PARENT)
FLOWLOCK_UNLOCK(f);
/* return value through luastate, as a luanumber */
@ -499,7 +499,7 @@ static int LuajitDecrFlowint(lua_State *luastate)
Flow *f;
FlowVar *fv;
DetectLuajitData *ld;
int need_flow_lock = 0;
int flow_lock = 0;
uint32_t number;
/* need luajit data for id -> idx conversion */
@ -514,7 +514,7 @@ static int LuajitDecrFlowint(lua_State *luastate)
}
/* need flow and lock hint */
f = LuaStateGetFlow(luastate, &need_flow_lock);
f = LuaStateGetFlow(luastate, &flow_lock);
if (f == NULL) {
lua_pushnil(luastate);
lua_pushstring(luastate, "no flow");
@ -544,7 +544,7 @@ static int LuajitDecrFlowint(lua_State *luastate)
}
/* lookup var */
if (need_flow_lock)
if (flow_lock == LUA_FLOW_NOT_LOCKED_BY_PARENT)
FLOWLOCK_RDLOCK(f);
fv = FlowVarGet(f, idx);
@ -557,7 +557,7 @@ static int LuajitDecrFlowint(lua_State *luastate)
}
FlowVarAddIntNoLock(f, idx, number);
if (need_flow_lock)
if (flow_lock == LUA_FLOW_NOT_LOCKED_BY_PARENT)
FLOWLOCK_UNLOCK(f);
/* return value through luastate, as a luanumber */
@ -568,7 +568,7 @@ static int LuajitDecrFlowint(lua_State *luastate)
}
void LuajitExtensionsMatchSetup(lua_State *lua_state, DetectLuajitData *ld, DetectEngineThreadCtx *det_ctx, Flow *f, int need_flow_lock)
void LuajitExtensionsMatchSetup(lua_State *lua_state, DetectLuajitData *ld, DetectEngineThreadCtx *det_ctx, Flow *f, int flow_locked)
{
SCLogDebug("det_ctx %p, f %p", det_ctx, f);
@ -582,7 +582,7 @@ void LuajitExtensionsMatchSetup(lua_State *lua_state, DetectLuajitData *ld, Dete
lua_pushlightuserdata(lua_state, (void *)det_ctx);
lua_settable(lua_state, LUA_REGISTRYINDEX);
LuaStateSetFlow(lua_state, f, need_flow_lock);
LuaStateSetFlow(lua_state, f, flow_locked);
}
/**

@ -29,7 +29,7 @@ int LuajitRegisterExtensions(lua_State *);
void LuajitExtensionsMatchSetup(lua_State *lua_state,
DetectLuajitData *, DetectEngineThreadCtx *det_ctx,
Flow *f, int need_flow_lock);
Flow *f, int flow_locked);
#endif /* HAVE_LUA */
#endif

@ -105,6 +105,8 @@ static pthread_mutex_t luajit_states_lock = SCMUTEX_INITIALIZER;
#endif /* HAVE_LUAJIT */
#include "util-lua.h"
static int DetectLuajitMatch (ThreadVars *, DetectEngineThreadCtx *,
Packet *, Signature *, SigMatch *);
static int DetectLuajitSetup (DetectEngineCtx *, Signature *, char *);
@ -269,7 +271,7 @@ void LuaDumpStack(lua_State *state)
int DetectLuajitMatchBuffer(DetectEngineThreadCtx *det_ctx, Signature *s, SigMatch *sm,
uint8_t *buffer, uint32_t buffer_len, uint32_t offset,
Flow *f, int need_flow_lock)
Flow *f, int flow_lock)
{
SCEnter();
int ret = 0;
@ -286,7 +288,7 @@ int DetectLuajitMatchBuffer(DetectEngineThreadCtx *det_ctx, Signature *s, SigMat
SCReturnInt(0);
/* setup extension data for use in lua c functions */
LuajitExtensionsMatchSetup(tluajit->luastate, luajit, det_ctx, f, need_flow_lock);
LuajitExtensionsMatchSetup(tluajit->luastate, luajit, det_ctx, f, flow_lock);
/* prepare data to pass to script */
lua_getglobal(tluajit->luastate, "match");
@ -396,7 +398,7 @@ static int DetectLuajitMatch (ThreadVars *tv, DetectEngineThreadCtx *det_ctx,
SCReturnInt(0);
/* setup extension data for use in lua c functions */
LuajitExtensionsMatchSetup(tluajit->luastate, luajit, det_ctx, p->flow, /* flow not locked */0);
LuajitExtensionsMatchSetup(tluajit->luastate, luajit, det_ctx, p->flow, /* flow not locked */LUA_FLOW_NOT_LOCKED_BY_PARENT);
if ((tluajit->flags & DATATYPE_PAYLOAD) && p->payload_len == 0)
SCReturnInt(0);

@ -61,7 +61,7 @@ typedef struct DetectLuajitData {
void DetectLuajitRegister (void);
int DetectLuajitMatchBuffer(DetectEngineThreadCtx *det_ctx, Signature *s, SigMatch *sm,
uint8_t *buffer, uint32_t buffer_len, uint32_t offset,
Flow *f, int need_flow_lock);
Flow *f, int flow_lock);
int DetectLuajitSetupStatesPool(int num, int reloads);
void DetectLuajitPostSetup(Signature *s);

@ -170,12 +170,12 @@ static int LuaCallbackTimeStringPushToStackFromFlow(lua_State *luastate, const F
static int LuaCallbackFlowTimeString(lua_State *luastate)
{
int r = 0;
int flow_is_locked = 0;
Flow *flow = LuaStateGetFlow(luastate, &flow_is_locked);
int locked = 0;
Flow *flow = LuaStateGetFlow(luastate, &locked);
if (flow == NULL)
return LuaCallbackError(luastate, "internal error: no flow");
if (!flow_is_locked) {
if (locked == LUA_FLOW_NOT_LOCKED_BY_PARENT) {
FLOWLOCK_RDLOCK(flow);
r = LuaCallbackTimeStringPushToStackFromFlow(luastate, flow);
FLOWLOCK_UNLOCK(flow);
@ -310,7 +310,7 @@ static int LuaCallbackTupleFlow(lua_State *luastate)
if (f == NULL)
return LuaCallbackError(luastate, "internal error: no flow");
if (lock_hint) {
if (lock_hint == LUA_FLOW_NOT_LOCKED_BY_PARENT) {
FLOWLOCK_RDLOCK(f);
r = LuaCallbackTuplePushToStackFromFlow(luastate, f);
FLOWLOCK_UNLOCK(f);
@ -349,7 +349,7 @@ static int LuaCallbackAppLayerProtoFlow(lua_State *luastate)
if (f == NULL)
return LuaCallbackError(luastate, "internal error: no flow");
if (lock_hint) {
if (lock_hint == LUA_FLOW_NOT_LOCKED_BY_PARENT) {
FLOWLOCK_RDLOCK(f);
r = LuaCallbackAppLayerProtoPushToStackFromFlow(luastate, f);
FLOWLOCK_UNLOCK(f);

@ -88,7 +88,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);
LuaStateSetFlow(td->lua_ctx->luastate, f, /* locked */FALSE);
LuaStateSetFlow(td->lua_ctx->luastate, f, /* locked */LUA_FLOW_LOCKED_BY_PARENT);
/* prepare data to pass to script */
lua_getglobal(td->lua_ctx->luastate, "log");
@ -147,7 +147,7 @@ static int LuaPacketLoggerAlerts(ThreadVars *tv, void *thread_data, const Packet
LuaStateSetThreadVars(td->lua_ctx->luastate, tv);
LuaStateSetPacket(td->lua_ctx->luastate, (Packet *)p);
LuaStateSetFlow(td->lua_ctx->luastate, p->flow, /* unlocked */TRUE);
LuaStateSetFlow(td->lua_ctx->luastate, p->flow, /* unlocked */LUA_FLOW_NOT_LOCKED_BY_PARENT);
LuaStateSetPacketAlert(td->lua_ctx->luastate, (PacketAlert *)pa);
/* prepare data to pass to script */
@ -206,7 +206,7 @@ static int LuaPacketLogger(ThreadVars *tv, void *thread_data, const Packet *p)
LuaStateSetThreadVars(td->lua_ctx->luastate, tv);
LuaStateSetPacket(td->lua_ctx->luastate, (Packet *)p);
LuaStateSetFlow(td->lua_ctx->luastate, p->flow, /* unlocked */TRUE);
LuaStateSetFlow(td->lua_ctx->luastate, p->flow, /* unlocked */LUA_FLOW_NOT_LOCKED_BY_PARENT);
/* prepare data to pass to script */
lua_newtable(td->lua_ctx->luastate);
@ -257,7 +257,7 @@ static int LuaFileLogger(ThreadVars *tv, void *thread_data, const Packet *p, con
LuaStateSetThreadVars(td->lua_ctx->luastate, tv);
LuaStateSetPacket(td->lua_ctx->luastate, (Packet *)p);
LuaStateSetTX(td->lua_ctx->luastate, txptr);
LuaStateSetFlow(td->lua_ctx->luastate, p->flow, /* locked */FALSE);
LuaStateSetFlow(td->lua_ctx->luastate, p->flow, /* locked */LUA_FLOW_LOCKED_BY_PARENT);
LuaStateSetFile(td->lua_ctx->luastate, (File *)ff);
/* get the lua function to call */

@ -26,6 +26,9 @@
#ifdef HAVE_LUA
#define LUA_FLOW_LOCKED_BY_PARENT 0
#define LUA_FLOW_NOT_LOCKED_BY_PARENT 1
/* gets */
/** \brief get tv pointer from the lua state */
@ -36,12 +39,13 @@ void *LuaStateGetTX(lua_State *luastate);
/** \brief get flow pointer from lua state
*
* \param lock_hint[out] pointer to bool indicating if flow is
* locked (TRUE) or unlocked unlocked (FALSE)
* \param locked_by_parent[out] bool indicating if flow is locked
* (LUA_FLOW_LOCKED_BY_PARENT) or unlocked
* (LUA_FLOW_NOT_LOCKED_BY_PARENT)
*
* \retval f flow poiner or NULL if it was not set
*/
Flow *LuaStateGetFlow(lua_State *luastate, int *lock_hint);
Flow *LuaStateGetFlow(lua_State *luastate, int *locked_by_parent);
PacketAlert *LuaStateGetPacketAlert(lua_State *luastate);
@ -56,10 +60,11 @@ void LuaStateSetTX(lua_State *luastate, void *tx);
/** \brief set a flow pointer in the lua state
*
* \param f flow pointer
* \param need_flow_lock bool indicating if flow is locked (TRUE)
* or unlocked unlocked (FALSE)
* \param locked_by_parent bool indicating if flow is locked
* (LUA_FLOW_LOCKED_BY_PARENT) or unlocked
* (LUA_FLOW_NOT_LOCKED_BY_PARENT)
*/
void LuaStateSetFlow(lua_State *luastate, Flow *f, int need_flow_lock);
void LuaStateSetFlow(lua_State *luastate, Flow *f, int locked_by_parent);
void LuaStateSetPacketAlert(lua_State *luastate, PacketAlert *pa);

Loading…
Cancel
Save