From: Victor Julien Date: Fri, 21 Mar 2014 21:26:37 +0000 (+0100) Subject: output-lua: clean up flow lock handling X-Git-Tag: suricata-2.1beta2~134 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cb69cee4d8d81080519a932530c65f4bfcff6481;p=thirdparty%2Fsuricata.git output-lua: clean up flow lock handling --- diff --git a/src/detect-engine-content-inspection.c b/src/detect-engine-content-inspection.c index 0feb0ff8f2..da46bad5f7 100644 --- a/src/detect-engine-content-inspection.c +++ b/src/detect-engine-content-inspection.c @@ -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; diff --git a/src/detect-luajit-extensions.c b/src/detect-luajit-extensions.c index 5fb9b0362c..0b9894f597 100644 --- a/src/detect-luajit-extensions.c +++ b/src/detect-luajit-extensions.c @@ -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); } /** diff --git a/src/detect-luajit-extensions.h b/src/detect-luajit-extensions.h index c8e678d750..27d7245ca2 100644 --- a/src/detect-luajit-extensions.h +++ b/src/detect-luajit-extensions.h @@ -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 diff --git a/src/detect-luajit.c b/src/detect-luajit.c index dcb74c35b8..c634a86b19 100644 --- a/src/detect-luajit.c +++ b/src/detect-luajit.c @@ -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); diff --git a/src/detect-luajit.h b/src/detect-luajit.h index 55eb9bde89..0abafec9e7 100644 --- a/src/detect-luajit.h +++ b/src/detect-luajit.h @@ -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); diff --git a/src/output-lua-common.c b/src/output-lua-common.c index bb8b3065b3..42a584115d 100644 --- a/src/output-lua-common.c +++ b/src/output-lua-common.c @@ -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); diff --git a/src/output-lua.c b/src/output-lua.c index 198b5554e4..42b86ace42 100644 --- a/src/output-lua.c +++ b/src/output-lua.c @@ -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 */ diff --git a/src/util-lua.h b/src/util-lua.h index 1b528d7789..a43dea736d 100644 --- a/src/util-lua.h +++ b/src/util-lua.h @@ -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);