]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
datajson: simplify memory handling
authorEric Leblond <el@stamus-networks.com>
Thu, 29 May 2025 08:31:02 +0000 (10:31 +0200)
committerVictor Julien <victor@inliniac.net>
Wed, 11 Jun 2025 18:49:18 +0000 (20:49 +0200)
DatajsonAdd function is now responsible of the handling of the mem
of datajsontype passed as argument.

src/datasets-context-json.c

index 6b8c24a5f2891137f0f43e66a2ccbac7a5f05972..044b3bf0d0abacf3d2cff167b2ff0e423f403fd1 100644 (file)
@@ -155,9 +155,6 @@ static int ParseJsonFile(const char *file, json_t **array, char *key)
 static int DatajsonAddString(
         Dataset *set, const uint8_t *data, const uint32_t data_len, const DataJsonType *json)
 {
-    if (set == NULL)
-        return -1;
-
     StringType lookup = { .ptr = (uint8_t *)data, .len = data_len, .json = *json };
     struct THashDataGetResult res = THashGetFromHash(set->hash, &lookup);
     if (res.data) {
@@ -170,9 +167,6 @@ static int DatajsonAddString(
 static int DatajsonAddMd5(
         Dataset *set, const uint8_t *data, const uint32_t data_len, const DataJsonType *json)
 {
-    if (set == NULL)
-        return -1;
-
     if (data_len != SC_MD5_LEN)
         return -2;
 
@@ -189,9 +183,6 @@ static int DatajsonAddMd5(
 static int DatajsonAddSha256(
         Dataset *set, const uint8_t *data, const uint32_t data_len, const DataJsonType *json)
 {
-    if (set == NULL)
-        return -1;
-
     if (data_len != SC_SHA256_LEN)
         return -2;
 
@@ -208,9 +199,6 @@ static int DatajsonAddSha256(
 static int DatajsonAddIPv4(
         Dataset *set, const uint8_t *data, const uint32_t data_len, const DataJsonType *json)
 {
-    if (set == NULL)
-        return -1;
-
     if (data_len < SC_IPV4_LEN)
         return -2;
 
@@ -227,9 +215,6 @@ static int DatajsonAddIPv4(
 static int DatajsonAddIPv6(
         Dataset *set, const uint8_t *data, const uint32_t data_len, const DataJsonType *json)
 {
-    if (set == NULL)
-        return -1;
-
     if (data_len != SC_IPV6_LEN)
         return -2;
 
@@ -243,27 +228,68 @@ static int DatajsonAddIPv6(
     return -1;
 }
 
+/*
+ * \brief Add data to the dataset from a JSON object.
+ *
+ * \param set The dataset to add data to.
+ * \param data The data to add.
+ * \param data_len The length of the data.
+ * \param json The JSON object containing additional information.
+ *
+ * Memory allocated for the `json` parameter will be freed if the data
+ * is not added to the hash.
+ *
+ * \retval 1 Data was added to the hash.
+ * \retval 0 Data was not added to the hash as it is already there.
+ * \retval -1 Failed to add data to the hash.
+ */
 static int DatajsonAdd(
         Dataset *set, const uint8_t *data, const uint32_t data_len, DataJsonType *json)
 {
-    if (set == NULL)
+    if (json == NULL)
+        return -1;
+    if (json->value == NULL)
         return -1;
 
+    if (set == NULL) {
+        if (json->value != NULL) {
+            SCFree(json->value);
+            json->value = NULL;
+        }
+        return -1;
+    }
+
+    int add_ret = 0;
     switch (set->type) {
         case DATASET_TYPE_STRING:
-            return DatajsonAddString(set, data, data_len, json);
+            add_ret = DatajsonAddString(set, data, data_len, json);
+            break;
         case DATASET_TYPE_MD5:
-            return DatajsonAddMd5(set, data, data_len, json);
+            add_ret = DatajsonAddMd5(set, data, data_len, json);
+            break;
         case DATASET_TYPE_SHA256:
-            return DatajsonAddSha256(set, data, data_len, json);
+            add_ret = DatajsonAddSha256(set, data, data_len, json);
+            break;
         case DATASET_TYPE_IPV4:
-            return DatajsonAddIPv4(set, data, data_len, json);
+            add_ret = DatajsonAddIPv4(set, data, data_len, json);
+            break;
         case DATASET_TYPE_IPV6:
-            return DatajsonAddIPv6(set, data, data_len, json);
+            add_ret = DatajsonAddIPv6(set, data, data_len, json);
+            break;
         default:
+            add_ret = -1;
             break;
     }
-    return -1;
+
+    if (add_ret == 1) {
+        return 1;
+    }
+
+    if (json->value != NULL) {
+        SCFree(json->value);
+        json->value = NULL;
+    }
+    return add_ret;
 }
 
 static int DatajsonLoadTypeFromJSON(Dataset *set, char *json_key, char *array_key,
@@ -367,16 +393,9 @@ static uint32_t DatajsonAddStringElement(Dataset *set, json_t *value, char *json
     int add_ret = DatajsonAdd(set, (const uint8_t *)val, strlen(val), &elt);
     if (add_ret < 0) {
         FatalErrorOnInit("datajson data add failed %s/%s", set->name, set->load);
-        SCFree(elt.value);
         return 0;
     }
-    if (add_ret == 0) {
-        SCFree(elt.value);
-    } else {
-        return 1;
-    }
-
-    return 0;
+    return add_ret;
 }
 
 static int DatajsonLoadString(Dataset *set, char *json_key, char *array_key, DatasetFormats format)
@@ -430,16 +449,9 @@ static uint32_t DatajsonAddMd5Element(Dataset *set, json_t *value, char *json_ke
     int add_ret = DatajsonAdd(set, (const uint8_t *)hash, SC_MD5_LEN, &elt);
     if (add_ret < 0) {
         FatalErrorOnInit("datajson data add failed %s/%s", set->name, set->load);
-        SCFree(elt.value);
         return 0;
     }
-    if (add_ret == 0) {
-        SCFree(elt.value);
-    } else {
-        return 1;
-    }
-
-    return 0;
+    return add_ret;
 }
 
 static int DatajsonLoadMd5(Dataset *set, char *json_key, char *array_key, DatasetFormats format)
@@ -493,16 +505,9 @@ static uint32_t DatajsonAddSha256Element(Dataset *set, json_t *value, char *json
     int add_ret = DatajsonAdd(set, (const uint8_t *)hash, SC_SHA256_LEN, &elt);
     if (add_ret < 0) {
         FatalErrorOnInit("datajson data add failed %s/%s", set->name, set->load);
-        SCFree(elt.value);
         return 0;
     }
-    if (add_ret == 0) {
-        SCFree(elt.value);
-    } else {
-        return 1;
-    }
-
-    return 0;
+    return add_ret;
 }
 
 static int DatajsonLoadSha256(Dataset *set, char *json_key, char *array_key, DatasetFormats format)
@@ -551,17 +556,10 @@ static uint32_t DatajsonAddIpv4Element(Dataset *set, json_t *value, char *json_k
     int add_ret = DatajsonAdd(set, (const uint8_t *)&in.s_addr, SC_IPV4_LEN, &elt);
     if (add_ret < 0) {
         FatalErrorOnInit("datajson data add failed %s/%s", set->name, set->load);
-        SCFree(elt.value);
         return 0;
     }
 
-    if (add_ret == 0) {
-        SCFree(elt.value);
-    } else {
-        return 1;
-    }
-
-    return 0;
+    return add_ret;
 }
 
 static int DatajsonLoadIPv4(Dataset *set, char *json_key, char *array_key, DatasetFormats format)
@@ -611,16 +609,9 @@ static uint32_t DatajsonAddIPv6Element(Dataset *set, json_t *value, char *json_k
     int add_ret = DatajsonAdd(set, (const uint8_t *)&in6.s6_addr, SC_IPV6_LEN, &elt);
     if (add_ret < 0) {
         FatalErrorOnInit("datajson data add failed %s/%s", set->name, set->load);
-        SCFree(elt.value);
         return 0;
     }
-    if (add_ret == 0) {
-        SCFree(elt.value);
-    } else {
-        return 1;
-    }
-
-    return 0;
+    return add_ret;
 }
 
 static int DatajsonLoadIPv6(Dataset *set, char *json_key, char *array_key, DatasetFormats format)
@@ -890,10 +881,9 @@ DataJsonResultType DatajsonLookup(Dataset *set, const uint8_t *data, const uint3
  */
 int DatajsonAddSerialized(Dataset *set, const char *value, const char *json)
 {
-    int ret;
-
     if (set == NULL)
         return -1;
+
     if (strlen(value) == 0)
         return -1;
 
@@ -913,11 +903,7 @@ int DatajsonAddSerialized(Dataset *set, const char *value, const char *json)
                     (const uint8_t *)value, strlen(value), SCBase64ModeStrict, decoded);
             if (num_decoded == 0)
                 goto operror;
-            ret = DatajsonAdd(set, decoded, num_decoded, &jvalue);
-            if (ret <= 0) {
-                SCFree(jvalue.value);
-            }
-            return ret;
+            return DatajsonAdd(set, decoded, num_decoded, &jvalue);
         }
         case DATASET_TYPE_MD5: {
             if (strlen(value) != SC_MD5_HEX_LEN)
@@ -925,11 +911,7 @@ int DatajsonAddSerialized(Dataset *set, const char *value, const char *json)
             uint8_t hash[SC_MD5_LEN];
             if (HexToRaw((const uint8_t *)value, SC_MD5_HEX_LEN, hash, sizeof(hash)) < 0)
                 goto operror;
-            ret = DatajsonAdd(set, hash, SC_MD5_LEN, &jvalue);
-            if (ret <= 0) {
-                SCFree(jvalue.value);
-            }
-            return ret;
+            return DatajsonAdd(set, hash, SC_MD5_LEN, &jvalue);
         }
         case DATASET_TYPE_SHA256: {
             if (strlen(value) != SC_SHA256_HEX_LEN)
@@ -937,21 +919,13 @@ int DatajsonAddSerialized(Dataset *set, const char *value, const char *json)
             uint8_t hash[SC_SHA256_LEN];
             if (HexToRaw((const uint8_t *)value, SC_SHA256_HEX_LEN, hash, sizeof(hash)) < 0)
                 goto operror;
-            ret = DatajsonAdd(set, hash, SC_SHA256_LEN, &jvalue);
-            if (ret <= 0) {
-                SCFree(jvalue.value);
-            }
-            return ret;
+            return DatajsonAdd(set, hash, SC_SHA256_LEN, &jvalue);
         }
         case DATASET_TYPE_IPV4: {
             struct in_addr in;
             if (inet_pton(AF_INET, value, &in) != 1)
                 goto operror;
-            ret = DatajsonAdd(set, (uint8_t *)&in.s_addr, SC_IPV4_LEN, &jvalue);
-            if (ret <= 0) {
-                SCFree(jvalue.value);
-            }
-            return ret;
+            return DatajsonAdd(set, (uint8_t *)&in.s_addr, SC_IPV4_LEN, &jvalue);
         }
         case DATASET_TYPE_IPV6: {
             struct in6_addr in6;
@@ -959,11 +933,7 @@ int DatajsonAddSerialized(Dataset *set, const char *value, const char *json)
                 SCLogError("Dataset failed to import %s as IPv6", value);
                 goto operror;
             }
-            ret = DatajsonAdd(set, (uint8_t *)&in6.s6_addr, SC_IPV6_LEN, &jvalue);
-            if (ret <= 0) {
-                SCFree(jvalue.value);
-            }
-            return ret;
+            return DatajsonAdd(set, (uint8_t *)&in6.s6_addr, SC_IPV6_LEN, &jvalue);
         }
     }
     SCFree(jvalue.value);