]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
output-lua: clean up flow lock handling
authorVictor Julien <victor@inliniac.net>
Fri, 21 Mar 2014 21:26:37 +0000 (22:26 +0100)
committerVictor Julien <victor@inliniac.net>
Fri, 15 Aug 2014 11:58:26 +0000 (13:58 +0200)
src/detect-engine-content-inspection.c
src/detect-luajit-extensions.c
src/detect-luajit-extensions.h
src/detect-luajit.c
src/detect-luajit.h
src/output-lua-common.c
src/output-lua.c
src/util-lua.h

index 0feb0ff8f272c28effa3fdf8047725307e66d918..da46bad5f7b4b471e9eabfbcad2c42827b46b274 100644 (file)
 #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;
index 5fb9b0362c34334a36d144b885ba520170ee1f54..0b9894f5976a0403af91c1673c404195b0d55ca6 100644 (file)
@@ -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);
 }
 
 /**
index c8e678d750ec2691866ef4aef6c2da5367e206bf..27d7245ca28befdcf390987461f5696cd4260823 100644 (file)
@@ -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
index dcb74c35b8a563bf1eb9fc2698995205a426df34..c634a86b19424760bb86f07e43ab3cf02df8e95f 100644 (file)
@@ -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);
index 55eb9bde89f396934fc52fcfcb4fb49457acc23c..0abafec9e7e82f90ba4645f4d2bf225af85f35fe 100644 (file)
@@ -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);
index bb8b3065b3b24c1b4fe11d8ff7b3f55742ec583a..42a584115dbd0dffa103289fde6f1dfff8cfe6ff 100644 (file)
@@ -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);
index 198b5554e41485ffe852b96e1651f7eb3d0ab4c2..42b86ace42a3408263f76ac8859bda98976b7dfb 100644 (file)
@@ -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 */
index 1b528d778923d79072d9b7886881ef0456700ec6..a43dea736dd3a9ef188cb5b0d45860cd866bc2b9 100644 (file)
@@ -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);