]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
datasets: improve lock handling
authorEric Leblond <el@stamus-networks.com>
Mon, 9 Jun 2025 09:45:03 +0000 (11:45 +0200)
committerVictor Julien <victor@inliniac.net>
Wed, 11 Jun 2025 18:49:19 +0000 (20:49 +0200)
DatasetGetOrCreate should now be called with the dataset lock
hold so the lock management is easier to read.

src/datasets-context-json.c
src/datasets.c

index 90f74ef0b62542d3856135be63a6a54fa1d63ca0..1f6e5e8ca114a214a6e0ca379f84aafc72245310 100644 (file)
@@ -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) {
index 9421def48439ae219cbf8ce03cb5877139483455..c283f42e214f4617b0d7d67dda4e2588710d0596 100644 (file)
@@ -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) {