#include "util-unittest-helper.h"
#include "util-profiling.h"
+#ifdef HAVE_LUA
+#include "util-lua.h"
+#endif
+
/**
* \brief Run the actual payload match functions
*
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;
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);
}
/* 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");
}
/* 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);
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 */
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);
}
/* 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");
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);
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 */
}
/* 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");
}
/* 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);
}
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 */
Flow *f;
DetectEngineThreadCtx *det_ctx;
DetectLuajitData *ld;
- int need_flow_lock = 0;
+ int flow_lock = 0;
uint32_t number;
lua_Number luanumber;
}
/* 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");
return 2;
}
- if (need_flow_lock)
+ if (flow_lock == LUA_FLOW_NOT_LOCKED_BY_PARENT)
FlowVarAddInt(f, idx, number);
else
FlowVarAddIntNoLock(f, idx, number);
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 */
}
/* 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");
}
/* lookup var */
- if (need_flow_lock)
+ if (flow_lock == LUA_FLOW_NOT_LOCKED_BY_PARENT)
FLOWLOCK_RDLOCK(f);
fv = FlowVarGet(f, idx);
}
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 */
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 */
}
/* 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");
}
/* lookup var */
- if (need_flow_lock)
+ if (flow_lock == LUA_FLOW_NOT_LOCKED_BY_PARENT)
FLOWLOCK_RDLOCK(f);
fv = FlowVarGet(f, idx);
}
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 */
}
-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);
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);
}
/**
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
#endif /* HAVE_LUAJIT */
+#include "util-lua.h"
+
static int DetectLuajitMatch (ThreadVars *, DetectEngineThreadCtx *,
Packet *, Signature *, SigMatch *);
static int DetectLuajitSetup (DetectEngineCtx *, Signature *, char *);
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;
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");
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);
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);
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);
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);
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);
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");
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 */
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);
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 */
#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 */
/** \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);
/** \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);