]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
detect: split new keyword id from registration
authorJason Ish <jason.ish@oisf.net>
Fri, 17 Jan 2025 20:46:07 +0000 (14:46 -0600)
committerVictor Julien <victor@inliniac.net>
Wed, 5 Mar 2025 14:59:58 +0000 (15:59 +0100)
Split DetectHelperKeywordRegister into 2 functions, one for acquiring
a new keyword ID, and another to perform the registration.

This makes it easier to do the traditional C keyword initialization
with a dynamic ID.

src/detect-engine-helper.c
src/detect-engine-helper.h

index 5337f95969c0a1808cec28d8789b9890049b683f..8c9cce7a04e57af7db18aa194128b6ba7e84887c 100644 (file)
@@ -94,7 +94,7 @@ int DetectHelperMultiBufferMpmRegister(const char *name, const char *desc, AppPr
     return DetectBufferTypeGetByName(name);
 }
 
-int DetectHelperKeywordRegister(const SCSigTableElmt *kw)
+int SCDetectHelperNewKeywordId(void)
 {
     if (DETECT_TBLSIZE_IDX >= DETECT_TBLSIZE) {
         void *tmp = SCRealloc(
@@ -103,48 +103,55 @@ int DetectHelperKeywordRegister(const SCSigTableElmt *kw)
             return -1;
         }
         sigmatch_table = tmp;
+        memset(&sigmatch_table[DETECT_TBLSIZE], 0, DETECT_TBLSIZE_STEP * sizeof(SigTableElmt));
         DETECT_TBLSIZE += DETECT_TBLSIZE_STEP;
     }
 
-    sigmatch_table[DETECT_TBLSIZE_IDX].name = kw->name;
-    sigmatch_table[DETECT_TBLSIZE_IDX].desc = kw->desc;
-    sigmatch_table[DETECT_TBLSIZE_IDX].url = kw->url;
-    sigmatch_table[DETECT_TBLSIZE_IDX].flags = kw->flags;
-    sigmatch_table[DETECT_TBLSIZE_IDX].AppLayerTxMatch =
+    DETECT_TBLSIZE_IDX++;
+    return DETECT_TBLSIZE_IDX - 1;
+}
+
+int DetectHelperKeywordRegister(const SCSigTableElmt *kw)
+{
+    int keyword_id = SCDetectHelperNewKeywordId();
+    if (keyword_id < 0) {
+        return -1;
+    }
+
+    sigmatch_table[keyword_id].name = kw->name;
+    sigmatch_table[keyword_id].desc = kw->desc;
+    sigmatch_table[keyword_id].url = kw->url;
+    sigmatch_table[keyword_id].flags = kw->flags;
+    sigmatch_table[keyword_id].AppLayerTxMatch =
             (int (*)(DetectEngineThreadCtx * det_ctx, Flow * f, uint8_t flags, void *alstate,
                     void *txv, const Signature *s, const SigMatchCtx *ctx)) kw->AppLayerTxMatch;
-    sigmatch_table[DETECT_TBLSIZE_IDX].Setup =
+    sigmatch_table[keyword_id].Setup =
             (int (*)(DetectEngineCtx * de, Signature * s, const char *raw)) kw->Setup;
-    sigmatch_table[DETECT_TBLSIZE_IDX].Free = (void (*)(DetectEngineCtx * de, void *ptr)) kw->Free;
-    DETECT_TBLSIZE_IDX++;
-    return DETECT_TBLSIZE_IDX - 1;
+    sigmatch_table[keyword_id].Free = (void (*)(DetectEngineCtx * de, void *ptr)) kw->Free;
+
+    return keyword_id;
 }
 
 int DetectHelperTransformRegister(const SCTransformTableElmt *kw)
 {
-    if (DETECT_TBLSIZE_IDX >= DETECT_TBLSIZE) {
-        void *tmp = SCRealloc(
-                sigmatch_table, (DETECT_TBLSIZE + DETECT_TBLSIZE_STEP) * sizeof(SigTableElmt));
-        if (unlikely(tmp == NULL)) {
-            return -1;
-        }
-        sigmatch_table = tmp;
-        DETECT_TBLSIZE += DETECT_TBLSIZE_STEP;
+    int transform_id = SCDetectHelperNewKeywordId();
+    if (transform_id < 0) {
+        return -1;
     }
 
-    sigmatch_table[DETECT_TBLSIZE_IDX].name = kw->name;
-    sigmatch_table[DETECT_TBLSIZE_IDX].desc = kw->desc;
-    sigmatch_table[DETECT_TBLSIZE_IDX].url = kw->url;
-    sigmatch_table[DETECT_TBLSIZE_IDX].flags = kw->flags;
-    sigmatch_table[DETECT_TBLSIZE_IDX].Transform =
+    sigmatch_table[transform_id].name = kw->name;
+    sigmatch_table[transform_id].desc = kw->desc;
+    sigmatch_table[transform_id].url = kw->url;
+    sigmatch_table[transform_id].flags = kw->flags;
+    sigmatch_table[transform_id].Transform =
             (void (*)(InspectionBuffer * buffer, void *options)) kw->Transform;
-    sigmatch_table[DETECT_TBLSIZE_IDX].TransformValidate = (bool (*)(
+    sigmatch_table[transform_id].TransformValidate = (bool (*)(
             const uint8_t *content, uint16_t content_len, void *context))kw->TransformValidate;
-    sigmatch_table[DETECT_TBLSIZE_IDX].Setup =
+    sigmatch_table[transform_id].Setup =
             (int (*)(DetectEngineCtx * de, Signature * s, const char *raw)) kw->Setup;
-    sigmatch_table[DETECT_TBLSIZE_IDX].Free = (void (*)(DetectEngineCtx * de, void *ptr)) kw->Free;
-    DETECT_TBLSIZE_IDX++;
-    return DETECT_TBLSIZE_IDX - 1;
+    sigmatch_table[transform_id].Free = (void (*)(DetectEngineCtx * de, void *ptr)) kw->Free;
+
+    return transform_id;
 }
 
 InspectionBuffer *DetectHelperGetMultiData(struct DetectEngineThreadCtx_ *det_ctx,
index 39fa632ed28ce184f1298c96a3439c7379ddb453..7c8044430850994a5fb338267faf2047321303f0 100644 (file)
@@ -28,6 +28,8 @@
 #include "detect.h"
 #include "rust.h"
 
+int SCDetectHelperNewKeywordId(void);
+
 int DetectHelperKeywordRegister(const SCSigTableElmt *kw);
 int DetectHelperBufferRegister(const char *name, AppProto alproto, bool toclient, bool toserver);