]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
datasets: fix hash table config
authorVictor Julien <victor@inliniac.net>
Thu, 3 Oct 2019 15:08:36 +0000 (17:08 +0200)
committerVictor Julien <victor@inliniac.net>
Fri, 4 Oct 2019 13:04:57 +0000 (15:04 +0200)
Example:

datasets:
  ua-seen:
    type: string
    state: ua-seen.lst
    hash:
      hash-size: 100000
      prealloc: 1000
      memcap: 256mb

src/datasets.c
src/datasets.h
src/detect-dataset.c

index 079b6619440d233ea0acde3f93a08e0cdb28bec6..6eec911207e83a03305947efe4bd892a7cdea2b4 100644 (file)
@@ -407,6 +407,10 @@ Dataset *DatasetFind(const char *name, enum DatasetTypes type)
 Dataset *DatasetGet(const char *name, enum DatasetTypes type,
         const char *save, const char *load)
 {
+    if (strlen(name) > DATASET_NAME_MAX_LEN) {
+        return NULL;
+    }
+
     SCMutexLock(&sets_lock);
     Dataset *set = DatasetSearchByName(name);
     if (set) {
@@ -461,9 +465,12 @@ Dataset *DatasetGet(const char *name, enum DatasetTypes type,
         SCLogDebug("set \'%s\' loading \'%s\' from \'%s\'", set->name, load, set->load);
     }
 
+    char cnf_name[128];
+    snprintf(cnf_name, sizeof(cnf_name), "datasets.%s.hash", name);
+
     switch (type) {
         case DATASET_TYPE_MD5:
-            set->hash = THashInit(name, sizeof(Md5Type), Md5StrSet,
+            set->hash = THashInit(cnf_name, sizeof(Md5Type), Md5StrSet,
                     Md5StrFree, Md5StrHash, Md5StrCompare);
             if (set->hash == NULL)
                 goto out_err;
@@ -471,7 +478,7 @@ Dataset *DatasetGet(const char *name, enum DatasetTypes type,
                 goto out_err;
             break;
         case DATASET_TYPE_STRING:
-            set->hash = THashInit(name, sizeof(StringType), StringSet,
+            set->hash = THashInit(cnf_name, sizeof(StringType), StringSet,
                     StringFree, StringHash, StringCompare);
             if (set->hash == NULL)
                 goto out_err;
@@ -479,7 +486,7 @@ Dataset *DatasetGet(const char *name, enum DatasetTypes type,
                 goto out_err;
             break;
         case DATASET_TYPE_SHA256:
-            set->hash = THashInit(name, sizeof(Sha256Type), Sha256StrSet,
+            set->hash = THashInit(cnf_name, sizeof(Sha256Type), Sha256StrSet,
                     Sha256StrFree, Sha256StrHash, Sha256StrCompare);
             if (set->hash == NULL)
                 goto out_err;
@@ -507,8 +514,6 @@ out_err:
     return NULL;
 }
 
-#define SETNAME_MAX 63
-
 int DatasetsInit(void)
 {
     SCLogDebug("datasets start");
@@ -527,9 +532,9 @@ int DatasetsInit(void)
             char load[PATH_MAX] = "";
 
             const char *set_name = iter->name;
-            if (strlen(set_name) > SETNAME_MAX) {
+            if (strlen(set_name) > DATASET_NAME_MAX_LEN) {
                 FatalError(SC_ERR_CONF_NAME_TOO_LONG, "set name '%s' too long, max %d chars",
-                        set_name, SETNAME_MAX);
+                        set_name, DATASET_NAME_MAX_LEN);
             }
 
             ConfNode *set_type =
index 514340b46fb0d1744571a61b2202b720d62cfdfa..0b20d34088178627caf13cc58c8eddfc37213b05 100644 (file)
@@ -32,8 +32,9 @@ enum DatasetTypes {
     DATASET_TYPE_SHA256,
 };
 
+#define DATASET_NAME_MAX_LEN 63
 typedef struct Dataset {
-    char name[64];
+    char name[DATASET_NAME_MAX_LEN + 1];
     enum DatasetTypes type;
     uint32_t id;
 
index a696c074975d00b309a0186afab9c0cf627055e8..0589e19b6821c60665f8b23c4f50eb5d97f6984a 100644 (file)
@@ -315,7 +315,7 @@ int DetectDatasetSetup (DetectEngineCtx *de_ctx, Signature *s, const char *rawst
     DetectDatasetData *cd = NULL;
     SigMatch *sm = NULL;
     uint8_t cmd = 0;
-    char cmd_str[16] = "", name[64] = "";
+    char cmd_str[16] = "", name[DATASET_NAME_MAX_LEN + 1] = "";
     enum DatasetTypes type = DATASET_TYPE_NOTSET;
     char load[PATH_MAX] = "";
     char save[PATH_MAX] = "";