]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
datajson: use systematic allocation
authorEric Leblond <el@stamus-networks.com>
Sat, 7 Jun 2025 19:34:50 +0000 (21:34 +0200)
committerVictor Julien <victor@inliniac.net>
Wed, 11 Jun 2025 18:49:18 +0000 (20:49 +0200)
src/datasets-context-json.c
src/datasets-context-json.h
src/datasets-ipv4.c
src/datasets-ipv6.c
src/datasets-md5.c
src/datasets-sha256.c
src/datasets-string.c

index 7b3c3d6fc497b2bc2175b9b5d3fd801d5955dfbb..7668583793b2deb4d22ea7db4f2902ae848d74e7 100644 (file)
@@ -51,6 +51,17 @@ void DatajsonUnlockElt(DataJsonResultType *r)
     }
 }
 
+int DatajsonCopyJson(DataJsonType *dst, DataJsonType *src)
+{
+    dst->len = src->len;
+    dst->value = SCMalloc(dst->len + 1);
+    if (dst->value == NULL)
+        return -1;
+    memcpy(dst->value, src->value, dst->len);
+    dst->value[dst->len] = '\0'; // Ensure null-termination
+    return 0;
+}
+
 /* return true if number is a float or an integer */
 static bool IsFloat(const char *in, size_t ins)
 {
@@ -281,16 +292,9 @@ static int DatajsonAdd(
             break;
     }
 
-    if (add_ret == 1) {
-        /* data was added to the hash, we take ownership */
-        json->value = NULL;
-        return 1;
-    }
+    SCFree(json->value);
+    json->value = NULL;
 
-    if (json->value != NULL) {
-        SCFree(json->value);
-        json->value = NULL;
-    }
     return add_ret;
 }
 
index 9871b1100509008a77521772c7146af039f65be2..7666b7e1c2c7d632c092f2c98e89d870324ad238 100644 (file)
@@ -52,4 +52,6 @@ int DatajsonAddSerialized(Dataset *set, const char *value, const char *json);
 
 void DatajsonUnlockElt(DataJsonResultType *r);
 
+int DatajsonCopyJson(DataJsonType *dst, DataJsonType *src);
+
 #endif /* SURICATA_DATAJSON_H*/
index 92dd49ece7cbccad0f9276c15ac6f4ab608195fa..1f82faaa710ff4d203f4821d637d03f3b24f1b43 100644 (file)
@@ -43,8 +43,9 @@ int IPv4JsonSet(void *dst, void *src)
     IPv4Type *src_s = src;
     IPv4Type *dst_s = dst;
     memcpy(dst_s->ipv4, src_s->ipv4, sizeof(dst_s->ipv4));
-    dst_s->json.value = src_s->json.value;
-    dst_s->json.len = src_s->json.len;
+
+    if (DatajsonCopyJson(&dst_s->json, &src_s->json) < 0)
+        return -1;
 
     return 0;
 }
index 896dde5dad0bc24fa9ac5a75d57122403ee423a2..30fbddc0b7e7bd72ae67600abbb1203b085dddb0 100644 (file)
@@ -44,8 +44,9 @@ int IPv6JsonSet(void *dst, void *src)
     IPv6Type *src_s = src;
     IPv6Type *dst_s = dst;
     memcpy(dst_s->ipv6, src_s->ipv6, sizeof(dst_s->ipv6));
-    dst_s->json.value = src_s->json.value;
-    dst_s->json.len = src_s->json.len;
+
+    if (DatajsonCopyJson(&dst_s->json, &src_s->json) < 0)
+        return -1;
 
     return 0;
 }
index 7beeeb2f9fb483d44d6a349a9383584cc339df85..b743b1169b6c64dfb2ec8564d146def108c824ce 100644 (file)
@@ -45,8 +45,10 @@ int Md5StrJsonSet(void *dst, void *src)
     Md5Type *src_s = src;
     Md5Type *dst_s = dst;
     memcpy(dst_s->md5, src_s->md5, sizeof(dst_s->md5));
-    dst_s->json.value = src_s->json.value;
-    dst_s->json.len = src_s->json.len;
+
+    if (DatajsonCopyJson(&dst_s->json, &src_s->json) < 0)
+        return -1;
+
     return 0;
 }
 
index 0f9dd8202d1f66c3587f0f9188372f6c32e6e00c..e1f90107cc2d57738f37112f435aa6880f9be4b3 100644 (file)
@@ -43,8 +43,10 @@ int Sha256StrJsonSet(void *dst, void *src)
     Sha256Type *src_s = src;
     Sha256Type *dst_s = dst;
     memcpy(dst_s->sha256, src_s->sha256, sizeof(dst_s->sha256));
-    dst_s->json.value = src_s->json.value;
-    dst_s->json.len = src_s->json.len;
+
+    if (DatajsonCopyJson(&dst_s->json, &src_s->json) < 0)
+        return -1;
+
     return 0;
 }
 
index c9c2b3b4be26307c4d7f9555ced0fa0b43ade278..6eb1dd546806a044b33cc98aa20355a938ac1168 100644 (file)
@@ -84,8 +84,10 @@ int StringJsonSet(void *dst, void *src)
     BUG_ON(dst_s->ptr == NULL);
     memcpy(dst_s->ptr, src_s->ptr, dst_s->len);
 
-    dst_s->json.value = src_s->json.value;
-    dst_s->json.len = src_s->json.len;
+    if (DatajsonCopyJson(&dst_s->json, &src_s->json) < 0) {
+        SCFree(dst_s->ptr);
+        return -1;
+    }
 
     SCLogDebug("dst %p src %p, dst_s->ptr %p dst_s->len %u", dst, src, dst_s->ptr, dst_s->len);
     return 0;