From: Eric Leblond Date: Thu, 29 May 2025 08:31:02 +0000 (+0200) Subject: datajson: simplify memory handling X-Git-Tag: suricata-8.0.0-rc1~42 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=79c8f431d0fae9abacac0aeabe3bdde3f69bec1f;p=thirdparty%2Fsuricata.git datajson: simplify memory handling DatajsonAdd function is now responsible of the handling of the mem of datajsontype passed as argument. --- diff --git a/src/datasets-context-json.c b/src/datasets-context-json.c index 6b8c24a5f2..044b3bf0d0 100644 --- a/src/datasets-context-json.c +++ b/src/datasets-context-json.c @@ -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);