From e264a0cee8f71e5fc7288423fbf73b5bec89c942 Mon Sep 17 00:00:00 2001 From: Victor Julien Date: Thu, 3 Oct 2019 17:08:36 +0200 Subject: [PATCH] datasets: fix hash table config Example: datasets: ua-seen: type: string state: ua-seen.lst hash: hash-size: 100000 prealloc: 1000 memcap: 256mb --- src/datasets.c | 19 ++++++++++++------- src/datasets.h | 3 ++- src/detect-dataset.c | 2 +- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/datasets.c b/src/datasets.c index 079b661944..6eec911207 100644 --- a/src/datasets.c +++ b/src/datasets.c @@ -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 = diff --git a/src/datasets.h b/src/datasets.h index 514340b46f..0b20d34088 100644 --- a/src/datasets.h +++ b/src/datasets.h @@ -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; diff --git a/src/detect-dataset.c b/src/detect-dataset.c index a696c07497..0589e19b68 100644 --- a/src/detect-dataset.c +++ b/src/detect-dataset.c @@ -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] = "";