]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
luajit: pass calling rule's sid,gid,rev to script as SCRuleSid, SCRuleGid, SCRuleRev.
authorVictor Julien <victor@inliniac.net>
Tue, 5 Nov 2013 20:45:08 +0000 (21:45 +0100)
committerVictor Julien <victor@inliniac.net>
Wed, 4 Dec 2013 14:06:11 +0000 (15:06 +0100)
src/detect-luajit.c
src/detect-luajit.h
src/detect-parse.c

index 71ee59e98220f579d1b1abd4e9403d027cf79061..a88c550bc6f8edcd6c3314240e94e73cadb5ce52 100644 (file)
@@ -499,6 +499,13 @@ static void *DetectLuajitThreadInit(void *data) {
 
     LuajitRegisterExtensions(t->luastate);
 
+    lua_pushinteger(t->luastate, (lua_Integer)(luajit->sid));
+    lua_setglobal(t->luastate, "SCRuleSid");
+    lua_pushinteger(t->luastate, (lua_Integer)(luajit->rev));
+    lua_setglobal(t->luastate, "SCRuleRev");
+    lua_pushinteger(t->luastate, (lua_Integer)(luajit->gid));
+    lua_setglobal(t->luastate, "SCRuleGid");
+
     /* hackish, needed to allow unittests to pass buffers as scripts instead of files */
 #ifdef UNITTESTS
     if (ut_script != NULL) {
@@ -869,6 +876,26 @@ error:
     return -1;
 }
 
+/** \brief post-sig parse function to set the sid,rev,gid into the
+ *         ctx, as this isn't available yet during parsing.
+ */
+void DetectLuajitPostSetup(Signature *s) {
+    int i;
+    SigMatch *sm;
+
+    for (i = 0; i < DETECT_SM_LIST_MAX; i++) {
+        for (sm = s->sm_lists[i]; sm != NULL; sm = sm->next) {
+            if (sm->type != DETECT_LUAJIT)
+                continue;
+
+            DetectLuajitData *ld = sm->ctx;
+            ld->sid = s->id;
+            ld->rev = s->rev;
+            ld->gid = s->gid;
+        }
+    }
+}
+
 /**
  * \brief this function will free memory associated with DetectLuajitData
  *
index 6d23452a0946629cd915a6f80b14b78139602033..00ce65060826d45c8bc465b1ff841ee59ee6e5f2 100644 (file)
@@ -50,6 +50,9 @@ typedef struct DetectLuajitData {
     uint16_t flowints;
     uint16_t flowvar[DETECT_LUAJIT_MAX_FLOWVARS];
     uint16_t flowvars;
+    uint32_t sid;
+    uint32_t rev;
+    uint32_t gid;
 } DetectLuajitData;
 #endif
 
@@ -60,5 +63,6 @@ int DetectLuajitMatchBuffer(DetectEngineThreadCtx *det_ctx, Signature *s, SigMat
         Flow *f, int need_flow_lock);
 
 int DetectLuajitSetupStatesPool(int num, int reloads);
+void DetectLuajitPostSetup(Signature *s);
 
 #endif /* __DETECT_FILELUAJIT_H__ */
index 887fb85aa9ebeced719e93544f762c7c1b793a72..25a0d0455e3992b472d8d3f3f08b607723257403 100644 (file)
@@ -41,6 +41,7 @@
 #include "detect-flow.h"
 #include "detect-app-layer-protocol.h"
 #include "detect-engine-apt-event.h"
+#include "detect-luajit.h"
 
 #include "pkt-var.h"
 #include "host.h"
@@ -1331,6 +1332,10 @@ int SigValidate(DetectEngineCtx *de_ctx, Signature *s) {
         }
     }
 
+#ifdef HAVE_LUAJIT
+    DetectLuajitPostSetup(s);
+#endif
+
 #ifdef DEBUG
     int i;
     for (i = 0; i < DETECT_SM_LIST_MAX; i++) {