From cfa7a747c29f9b95d85c0ca4b7d6f5ea8b15c0cb Mon Sep 17 00:00:00 2001 From: Eric Leblond Date: Sat, 7 Jun 2025 21:34:50 +0200 Subject: [PATCH] datajson: use systematic allocation --- src/datasets-context-json.c | 22 +++++++++++++--------- src/datasets-context-json.h | 2 ++ src/datasets-ipv4.c | 5 +++-- src/datasets-ipv6.c | 5 +++-- src/datasets-md5.c | 6 ++++-- src/datasets-sha256.c | 6 ++++-- src/datasets-string.c | 6 ++++-- 7 files changed, 33 insertions(+), 19 deletions(-) diff --git a/src/datasets-context-json.c b/src/datasets-context-json.c index 7b3c3d6fc4..7668583793 100644 --- a/src/datasets-context-json.c +++ b/src/datasets-context-json.c @@ -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; } diff --git a/src/datasets-context-json.h b/src/datasets-context-json.h index 9871b11005..7666b7e1c2 100644 --- a/src/datasets-context-json.h +++ b/src/datasets-context-json.h @@ -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*/ diff --git a/src/datasets-ipv4.c b/src/datasets-ipv4.c index 92dd49ece7..1f82faaa71 100644 --- a/src/datasets-ipv4.c +++ b/src/datasets-ipv4.c @@ -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; } diff --git a/src/datasets-ipv6.c b/src/datasets-ipv6.c index 896dde5dad..30fbddc0b7 100644 --- a/src/datasets-ipv6.c +++ b/src/datasets-ipv6.c @@ -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; } diff --git a/src/datasets-md5.c b/src/datasets-md5.c index 7beeeb2f9f..b743b1169b 100644 --- a/src/datasets-md5.c +++ b/src/datasets-md5.c @@ -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; } diff --git a/src/datasets-sha256.c b/src/datasets-sha256.c index 0f9dd8202d..e1f90107cc 100644 --- a/src/datasets-sha256.c +++ b/src/datasets-sha256.c @@ -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; } diff --git a/src/datasets-string.c b/src/datasets-string.c index c9c2b3b4be..6eb1dd5468 100644 --- a/src/datasets-string.c +++ b/src/datasets-string.c @@ -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; -- 2.47.2