From 8425eed8cdabdcb08310269eff38902e7af01efd Mon Sep 17 00:00:00 2001 From: Eric Leblond Date: Mon, 9 Jun 2025 11:45:03 +0200 Subject: [PATCH] datasets: improve lock handling DatasetGetOrCreate should now be called with the dataset lock hold so the lock management is easier to read. --- src/datasets-context-json.c | 2 ++ src/datasets.c | 8 +++----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/datasets-context-json.c b/src/datasets-context-json.c index 90f74ef0b6..1f6e5e8ca1 100644 --- a/src/datasets-context-json.c +++ b/src/datasets-context-json.c @@ -634,9 +634,11 @@ Dataset *DatajsonGet(const char *name, enum DatasetTypes type, const char *load, { Dataset *set = NULL; + DatasetLock(); int ret = DatasetGetOrCreate(name, type, NULL, load, &memcap, &hashsize, &set); if (ret < 0) { SCLogError("dataset with JSON %s creation failed", name); + DatasetUnlock(); return NULL; } if (ret == 1) { diff --git a/src/datasets.c b/src/datasets.c index 9421def484..c283f42e21 100644 --- a/src/datasets.c +++ b/src/datasets.c @@ -364,7 +364,7 @@ static void DatasetUpdateHashsize(const char *name, uint32_t hash_size) * \return 0 on successful creation * \return 1 if the dataset already exists * - * dataset global lock is held after return if set is found or created + * Calling function is responsible for locking via DatasetLock() */ int DatasetGetOrCreate(const char *name, enum DatasetTypes type, const char *save, const char *load, uint64_t *memcap, uint32_t *hashsize, Dataset **ret_set) @@ -375,14 +375,12 @@ int DatasetGetOrCreate(const char *name, enum DatasetTypes type, const char *sav return -1; } - DatasetLock(); Dataset *set = DatasetSearchByName(name); if (set) { if (type != DATASET_TYPE_NOTSET && set->type != type) { SCLogError("dataset %s already " "exists and is of type %u", set->name, set->type); - DatasetUnlock(); return -1; } @@ -400,7 +398,6 @@ int DatasetGetOrCreate(const char *name, enum DatasetTypes type, const char *sav if ((load == NULL && strlen(set->load) > 0) || (load != NULL && strcmp(set->load, load) != 0)) { SCLogError("dataset %s load mismatch: %s != %s", set->name, set->load, load); - DatasetUnlock(); return -1; } } @@ -451,7 +448,6 @@ out_err: } SCFree(set); } - DatasetUnlock(); return -1; } @@ -460,9 +456,11 @@ Dataset *DatasetGet(const char *name, enum DatasetTypes type, const char *save, { Dataset *set = NULL; + DatasetLock(); int ret = DatasetGetOrCreate(name, type, save, load, &memcap, &hashsize, &set); if (ret < 0) { SCLogError("dataset %s creation failed", name); + DatasetUnlock(); return NULL; } if (ret == 1) { -- 2.47.2