datajson: simplify memory handling

DatajsonAdd function is now responsible of the handling of the mem
of datajsontype passed as argument.
pull/13432/head
Eric Leblond 1 year ago committed by Victor Julien
parent 606f7ba656
commit 79c8f431d0

@ -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);

Loading…
Cancel
Save