From 28742871d2b8ebff0566ee1099d44d965937252a Mon Sep 17 00:00:00 2001 From: Eric Leblond Date: Fri, 2 May 2025 17:30:14 +0200 Subject: [PATCH] datasets: separate DatasetGet in 2 functions This will be used to factorize the code with datajson. --- src/datasets.c | 50 ++++++++++++++++++++++++++++++++++---------------- src/datasets.h | 2 ++ 2 files changed, 36 insertions(+), 16 deletions(-) diff --git a/src/datasets.c b/src/datasets.c index d147538113..566d2198e5 100644 --- a/src/datasets.c +++ b/src/datasets.c @@ -341,8 +341,8 @@ static void DatasetUpdateHashsize(const char *name, uint32_t hash_size) } } -Dataset *DatasetGet(const char *name, enum DatasetTypes type, const char *save, const char *load, - uint64_t memcap, uint32_t hashsize) +Dataset *DatasetCreateOrGet(const char *name, enum DatasetTypes type, const char *save, + const char *load, uint64_t *memcap, uint32_t *hashsize) { uint64_t default_memcap = 0; uint32_t default_hashsize = 0; @@ -390,11 +390,14 @@ Dataset *DatasetGet(const char *name, enum DatasetTypes type, const char *save, } DatasetGetDefaultMemcap(&default_memcap, &default_hashsize); - if (hashsize == 0) { - hashsize = default_hashsize; + if (*hashsize == 0) { + *hashsize = default_hashsize; + } + if (*memcap == 0) { + *memcap = default_memcap; } - if (!DatasetCheckHashsize(name, hashsize)) { + if (!DatasetCheckHashsize(name, *hashsize)) { goto out_err; } @@ -413,15 +416,33 @@ Dataset *DatasetGet(const char *name, enum DatasetTypes type, const char *save, strlcpy(set->load, load, sizeof(set->load)); SCLogDebug("set \'%s\' loading \'%s\' from \'%s\'", set->name, load, set->load); } + return set; +out_err: + if (set) { + if (set->hash) { + THashShutdown(set->hash); + } + SCFree(set); + } + SCMutexUnlock(&sets_lock); + return NULL; +} + +Dataset *DatasetGet(const char *name, enum DatasetTypes type, const char *save, const char *load, + uint64_t memcap, uint32_t hashsize) +{ + Dataset *set = DatasetCreateOrGet(name, type, save, load, &memcap, &hashsize); + if (set == NULL) { + SCLogError("dataset %s creation failed", name); + return NULL; + } char cnf_name[128]; snprintf(cnf_name, sizeof(cnf_name), "datasets.%s.hash", name); - switch (type) { case DATASET_TYPE_MD5: set->hash = THashInit(cnf_name, sizeof(Md5Type), Md5StrSet, Md5StrFree, Md5StrHash, - Md5StrCompare, NULL, NULL, load != NULL ? 1 : 0, - memcap > 0 ? memcap : default_memcap, hashsize); + Md5StrCompare, NULL, NULL, load != NULL ? 1 : 0, memcap, hashsize); if (set->hash == NULL) goto out_err; if (DatasetLoadMd5(set) < 0) @@ -429,8 +450,7 @@ Dataset *DatasetGet(const char *name, enum DatasetTypes type, const char *save, break; case DATASET_TYPE_STRING: set->hash = THashInit(cnf_name, sizeof(StringType), StringSet, StringFree, StringHash, - StringCompare, NULL, StringGetLength, load != NULL ? 1 : 0, - memcap > 0 ? memcap : default_memcap, hashsize); + StringCompare, NULL, StringGetLength, load != NULL ? 1 : 0, memcap, hashsize); if (set->hash == NULL) goto out_err; if (DatasetLoadString(set) < 0) @@ -438,8 +458,8 @@ Dataset *DatasetGet(const char *name, enum DatasetTypes type, const char *save, break; case DATASET_TYPE_SHA256: set->hash = THashInit(cnf_name, sizeof(Sha256Type), Sha256StrSet, Sha256StrFree, - Sha256StrHash, Sha256StrCompare, NULL, NULL, load != NULL ? 1 : 0, - memcap > 0 ? memcap : default_memcap, hashsize); + Sha256StrHash, Sha256StrCompare, NULL, NULL, load != NULL ? 1 : 0, memcap, + hashsize); if (set->hash == NULL) goto out_err; if (DatasetLoadSha256(set) < 0) @@ -447,8 +467,7 @@ Dataset *DatasetGet(const char *name, enum DatasetTypes type, const char *save, break; case DATASET_TYPE_IPV4: set->hash = THashInit(cnf_name, sizeof(IPv4Type), IPv4Set, IPv4Free, IPv4Hash, - IPv4Compare, NULL, NULL, load != NULL ? 1 : 0, - memcap > 0 ? memcap : default_memcap, hashsize); + IPv4Compare, NULL, NULL, load != NULL ? 1 : 0, memcap, hashsize); if (set->hash == NULL) goto out_err; if (DatasetLoadIPv4(set) < 0) @@ -456,8 +475,7 @@ Dataset *DatasetGet(const char *name, enum DatasetTypes type, const char *save, break; case DATASET_TYPE_IPV6: set->hash = THashInit(cnf_name, sizeof(IPv6Type), IPv6Set, IPv6Free, IPv6Hash, - IPv6Compare, NULL, NULL, load != NULL ? 1 : 0, - memcap > 0 ? memcap : default_memcap, hashsize); + IPv6Compare, NULL, NULL, load != NULL ? 1 : 0, memcap, hashsize); if (set->hash == NULL) goto out_err; if (DatasetLoadIPv6(set) < 0) diff --git a/src/datasets.h b/src/datasets.h index e2a7a4725a..c3aad61c09 100644 --- a/src/datasets.h +++ b/src/datasets.h @@ -68,6 +68,8 @@ Dataset *DatasetSearchByName(const char *name); Dataset *DatasetFind(const char *name, enum DatasetTypes type); Dataset *DatasetGet(const char *name, enum DatasetTypes type, const char *save, const char *load, uint64_t memcap, uint32_t hashsize); +Dataset *DatasetCreateOrGet(const char *name, enum DatasetTypes type, const char *save, + const char *load, uint64_t *memcap, uint32_t *hashsize); int DatasetAdd(Dataset *set, const uint8_t *data, const uint32_t data_len); int DatasetRemove(Dataset *set, const uint8_t *data, const uint32_t data_len); int DatasetLookup(Dataset *set, const uint8_t *data, const uint32_t data_len); -- 2.47.2